java程序实现对证书的操作

1 Java程序从证书文件读取证书

import java.io.*;

import java.security.cert.*;

public class PrintCert{

public static void main(String args[ ]) throws Exception{

        CertificateFactory cf=CertificateFactory.getInstance("X.509");

        FileInputStream in=new FileInputStream("my.cer");

        Certificate c=cf.generateCertificate(in);

        in.close();

        String s=c.toString( );

        // 显示证书

        FileOutputStream fout=new FileOutputStream("tmp.txt");

         BufferedWriter out= new BufferedWriter(new OutputStreamWriter(fout));

        out.write(s,0,s.length( )); 

        out.close();   

}

}  


 2 Java程序从密钥库直接读取证书

import java.io.*;

import java.security.*;

import java.security.cert.Certificate;

public class PrintCert2{

    public static void main(String args[ ]) throws Exception{

          String pass="080302";

          String alias="mykey";

          String name=".keystore";

          FileInputStream in=new FileInputStream(name);

          KeyStore ks=KeyStore.getInstance("JKS");           

          ks.load(in,pass.toCharArray());

          Certificate c=ks.getCertificate(alias);

          in.close();

         System.out.println(c.toString( ));

    }

}  


3 Java程序显示证书指定信息(全名/公钥/签名等)

import java.io.*;

import java.security.*;

import java.security.cert.*;

import java.math.*;

public class ShowCertInfo{

   public static void main(String args[ ]) throws Exception{

        CertificateFactory cf=CertificateFactory.getInstance("X.509");

        FileInputStream in=new FileInputStream("my.cer");

        java.security.cert.Certificate c=cf.generateCertificate(in);

        in.close();

        X509Certificate t=(X509Certificate) c;

        System.out.println("版本号 "+t.getVersion());

        System.out.println("序列号 "+t.getSerialNumber().toString(16));

        System.out.println("全名 "+t.getSubjectDN());

        System.out.println("签发者全名n"+t.getIssuerDN());

        System.out.println("有效期起始日 "+t.getNotBefore());

        System.out.println("有效期截至日 "+t.getNotAfter());

        System.out.println("签名算法 "+t.getSigAlgName());

        byte[] sig=t.getSignature();

        System.out.println("签名n"+new BigInteger(sig).toString(16));

        PublicKey pk=t.getPublicKey();

        byte[ ] pkenc=pk.getEncoded();

        System.out.println("公钥");

        for(int i=0;i< div=""> 

        System.out.print(pkenc[i]+",");

        }

}

}

4 数字签名-对数字证书的数字签名

import java.io.*;
import java.security.*;
import java.security.cert.*;
import java.util.*;
import sun.security.x509.*;
/*
 * CA密钥库和其密码、CA中要使用的条目和其密码,新密钥库和其密码、新的条目名称

 * 特别注意:java中有些类得到特别保护(比如X509CertImpl),必须设置规则才能访问【项目属性-Java Build Path-JRE  

 * System Library-Access Rules-Edit-"sun/**"(Accessible)】
 */
public class SignCert{
    public static void main(String args[ ]) throws Exception{
        String signerName = "keystore/ibe"; 
        String signerAlias = "he";
        char[] signerStorePass = "080302".toCharArray( );
        char[] signerKeyPass = "080302".toCharArray( ); 
        String CertName = "cert/ibe-mao.cer";
        String newStore = "keystore/newstore";
        String newStoreAlias = "mao";
        char[] newStorePass = "080302".toCharArray();
        // CA证书
        FileInputStream in=new FileInputStream(signerName);
        KeyStore ks=KeyStore.getInstance("JKS");
        ks.load(in,signerStorePass);
        java.security.cert.Certificate c1=ks.getCertificate(signerAlias);
        PrivateKey caprk=(PrivateKey)ks.getKey(signerAlias,signerKeyPass);
        in.close();
        //得到签发者
        byte[] encod1=c1.getEncoded();
        X509CertImpl cimp1=new X509CertImpl(encod1);
        X509CertInfo cinfo1=(X509CertInfo)cimp1.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);
        X500Name issuer=(X500Name)cinfo1.get(X509CertInfo.SUBJECT+"."+CertificateIssuerName.DN_NAME);
        //要签名的证书
        CertificateFactory cf=CertificateFactory.getInstance("X.509");
        FileInputStream in2=new FileInputStream(CertName);
        java.security.cert.Certificate c2=cf.generateCertificate(in2);
        in2.close();
        byte[] encod2=c2.getEncoded();
        X509CertImpl cimp2=new X509CertImpl(encod2);    
        X509CertInfo cinfo2=(X509CertInfo)cimp2.get(
        X509CertImpl.NAME+"."+X509CertImpl.INFO);
        //设置新证书有效期
        Date begindate =new Date();
        //60 day
        Date enddate =new Date(begindate.getTime()+3000*24*60*60*1000L);           
        CertificateValidity cv=new CertificateValidity(begindate,enddate);
        cinfo2.set(X509CertInfo.VALIDITY,cv);
        //设置新证书序列号
        int sn=(int)(begindate.getTime()/1000);
        CertificateSerialNumber csn=new CertificateSerialNumber(sn);
        cinfo2.set(X509CertInfo.SERIAL_NUMBER,csn);
        //设置新证书签发者
        cinfo2.set(X509CertInfo.ISSUER+"."+CertificateIssuerName.DN_NAME,issuer);
        //设置新证书算法
        AlgorithmId algorithm = new AlgorithmId(AlgorithmId.sha1WithRSAEncryption_oid);
        cinfo2.set(CertificateAlgorithmId.NAME+"."+CertificateAlgorithmId.ALGORITHM, algorithm);
        // 创建证书
        X509CertImpl newcert=new X509CertImpl(cinfo2);
        // 签名
        newcert.sign(caprk,"sha1WithRSA");
        //打印到控制台,验证一下信息
        System.out.println(newcert);
        // 存入密钥库
        ks.setCertificateEntry(newStoreAlias, newcert);
        FileOutputStream out=new FileOutputStream(newStore);
        ks.store(out,newStorePass);
        out.close();
    }
} 
注意:SignCert.java需要进行下面的处理才能正常导包。(eclipse把默认访问受限的api设成了error
选中项目--右键--进入Properties(属性)视图
选中Java Build Path--点击Libraries--展开JRE System Library[JavaSE-1.6],选中Access rules这一项(如果没有,那就是JDK安装和配置的问题)。   
Edit--点击Add--Rule Pattern(规则式样)编辑你允许导入的类库,如本例中输入(sun/**),允许就是在Resolution选项中选中Accessible(当然,有些项目需要可以选择ForbiddenDiscourage某些类库)。
然后重启就可以了。

 

5 验证CertPath证书链

验证CertPath证书链-CertPathValidator类基于TrustAnchor验证证书链
CertPathValidator类中的validate( )方法可以使用现成的PKIX certification path验证算法直接验证CertPath类型的对象。方法的第一个参数传入要验证的CertPath对象,第二个参数传入PKIXParameters类型的对象,它提供了验证时所使用的参数。
为了得到PKIXParameters类型的对象,必须指定最信任哪些CA。
ValidateCP.java
package cert;
import java.io.*;
import java.security.cert.*;
import java.security.cert.Certificate;
import java.util.*;
public class ValidateCP{          
    public static void main(String args[ ]) throws Exception{
        String[] arg=new String[]{"cert/ibe-mao-signed.cer","cert/ibe-he.cer"};
        String trustAnchor = "cert/ibe-he.cer";
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        int i;
        Listmylist = new ArrayList();
        for (i=0;i<arg.length;i++){
        FileInputStream in=new FileInputStream(arg[i]);
                Certificate c=cf.generateCertificate(in);
                mylist.add(c);
        }
        CertPath cp = cf.generateCertPath(mylist);
        //以上将证书列表转换成证书链
        //设置锚点
        FileInputStream in=new FileInputStream(trustAnchor);
        Certificate trust=cf.generateCertificate(in);
        // Create TrustAnchor
        TrustAnchor anchor = new TrustAnchor( (X509Certificate)trust,null);
        // Set the PKIX parameters
        PKIXParameters params = new PKIXParameters(Collections.singleton(anchor));
        params.setRevocationEnabled(false);
        CertPathValidator cpv = CertPathValidator.getInstance("PKIX");
        try {
         PKIXCertPathValidatorResult result =(PKIXCertPathValidatorResult) cpv.validate(cp, params);
         System.out.println(result);
         System.out.println(result.getTrustAnchor());
        } catch (CertPathValidatorException cpve) {
         System.out.println("Validation failure, cert[" + cpve.getIndex() + "] :" + cpve.getMessage());
        }
 }
} 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用Java实现读取证书访问HTTPS接口,需要遵循以下步骤: 1. 获取证书:首先,需要获取要访问的HTTPS服务器的证书。可以使用浏览器访问该服务器,并导出证书为一个文件(一般为.crt或.pem格式)。 2. 将证书导入Java密钥库:将第一步获得的证书导入Java密钥库中。可以使用Java提供的keytool工具,执行类似以下命令: ``` keytool -import -file /path/to/certificate.crt -alias servercert -keystore /path/to/keystore.jks ``` 这将把证书导入到指定的密钥库中,并为证书指定一个别名。 3. 创建SSLContext:使用Java的KeyStore类加载密钥库,并创建一个包含需要的信任管理器的SSLContext实例。可以使用以下代码实现: ```java KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream trustStoreFile = new FileInputStream("/path/to/keystore.jks"); trustStore.load(trustStoreFile, "keystorepassword".toCharArray()); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trustStore); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustManagerFactory.getTrustManagers(), null); ``` 4. 创建HttpClient:使用Apache HttpClient库创建一个HttpClient对象,并指定使用刚才创建的SSLContext实例来进行HTTPS连接。可以使用以下代码实现: ```java HttpClient client = HttpClients.custom().setSSLContext(sslContext).build(); ``` 5. 发送HTTPS请求:使用HttpClient对象发送HTTPS请求到目标接口。可以使用HttpGet或HttpPost等请求类型,并执行execute方法,如下所示: ```java HttpGet request = new HttpGet("https://api.example.com"); HttpResponse response = client.execute(request); ``` 以上步骤完成后,即可通过Java程序读取证书并访问HTTPS接口。需要注意的是,从第3步开始的代码需要进行异常处理,同时确保路径和密码等参数正确配置。 ### 回答2: 要用Java实现读取证书访问HTTPS接口,可以按照以下步骤进行操作: 1. 确保你已经获取到了HTTPS接口所需的证书文件,一般为以.crt、.pem或.jks为扩展名的文件。 2. 首先,需要创建一个HttpClient对象,用于发送HTTP请求。可以使用Apache HttpClient库来实现,该库提供了丰富的HTTP客户端功能。 3. 创建SSLContext对象,用于在发送HTTPS请求时验证服务器证书的有效性。可以使用KeyStore类加载证书文件,并通过TrustManagerFactory初始化SSLContext。 4. 创建一个HostnameVerifier对象,用于验证服务器主机名的有效性。可以使用自定义的实现类,也可以使用默认的实现类。 5. 创建一个HttpClientBuilder对象,并将SSLContext和HostnameVerifier对象设置给它。 6. 使用HttpClientBuilder对象创建HttpClient对象,同时设置代理、超时等相关参数。 7. 创建一个HttpGet或HttpPost对象,设置请求的URL和相关参数。 8. 调用HttpClient对象的execute方法发送请求,并获取返回的HttpResponse对象。 9. 从HttpResponse对象中获取服务器返回的数据,并进行后续处理。 示例代码如下: ```java import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.security.KeyStore; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManagerFactory; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.ssl.TrustManagerFactoryBuilder; public class HttpsClientExample { public static void main(String[] args) { try { // 加载证书 KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); trustStore.load(HttpsClientExample.class.getResourceAsStream("client-truststore.crt"), "password".toCharArray()); TrustManagerFactory trustManagerFactory = TrustManagerFactoryBuilder.newBuilder() .withDefaultAlgorithm() .withKeystore(trustStore) .build(); SSLContext sslContext = SSLContextBuilder.create() .loadTrustMaterial(trustManagerFactory) .build(); CloseableHttpClient httpClient = HttpClients.custom() .setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext)) .build(); HttpGet httpGet = new HttpGet("https://example.com/api"); HttpResponse response = httpClient.execute(httpGet); HttpEntity entity = response.getEntity(); // 读取返回的数据 InputStream inputStream = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } httpClient.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 以上就是使用Java实现读取证书访问HTTPS接口的基本步骤,根据具体的证书和接口要求,可能需要进行一些额外的配置和参数设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值