PKCS12 证书的生成及验证

本文详细介绍了如何生成PKCS12证书库,包括生成证书、查看证书、导出证书等步骤,并提供了证书下载的Servlet示例。通过Java的keytool工具,演示了如何操作PKCS12格式的证书,以及更新证书的有效期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

本文首先感谢 Apple 开发者论坛的eskimo1,他是我见过的最热心肠的人,对任何人他都不吝于给予无私帮助。

服务器生成PKCS12证书库,并通过servlet导出为DER客户端证书(含一个密钥和一个证书)。iPhone从服务器下载证书后,如何进行验证?

一、生成证书

假设密钥库为dlt.p12,库密码ipcc@95598,有效期1天,则命令为:

keytool -genkey -v-alias root -keyalg RSA -storetype PKCS12 -keystore dlt.p12 -dname "CN=www.handtimes.com,OU=ipcc,O=云电同方,L=昆明,ST=云南,C=中国"-storepass ipcc@95598 -keypass ipcc@95598

生成客户端用的证书:

keytool -genkey -v-alias p12client -keyalg RSA -storetype PKCS12 -keystore dlt.p12 -dname"CN=www.handtimes.com,OU=ipcc,O=云电同方,L=昆明,ST=云南,C=中国" -storepass ipcc@95598-keypass 123456 -validity 1

 

要查看已生成的证书,用下面的命令:

keytool -list -v-alias p12client -keystore dlt.p12 -storepass ipcc@95598 -storetype PKCS12

或者:

keytool -list -v-keystore IPCCCA dlt.p12 ipcc@95598 -storetype PKCS12

 

如果需要将p12证书导出为.cer格式,可以使用命令:

keytool -export-alias p12client -keystore dlt.p12 -storetype PKCS12 -storepass ipcc@95598 -rfc-file p12.cer

查看.cer文件:

keytool -printcert-v -file /Users/kmyhy/Desktop/client.cer

如果需要将keystore中的私钥导出为.p12格式:

Keytool.exe-importkeystore -srckeystore IPCCCA -srcstoretype jks -srcstorepass ipcc@95598 -srcaliasp12client  -destkeystore dltclient.p12-deststoretype pkcs12 -deststorepass ipcc@95598 -destkeypass 123456 validity 3

注意,keytool用的是jdk1.6提供的版本。此时命令提示忽略用户输入的destkeypass密码:

重新输入密码123456,回车,将在用户主目录下生成dltclient.p12文件。

查看dltclient.p12内容:

keytool.exe -list-keystore dltclient.p12 -storepass ipcc@95598 -storetype pkcs12

可以看到如下输出:

 

可以看到其中包含了证书和私钥,并且其认证指纹是和IPCCCA中的一模一样的。

一、提供证书下载

先把生成的p12证书库dlt.p12放到服务器目录下。

新建一个Servlet:GetP12Cert。

public class GetP12Cert extends HttpServlet {

private static final long serialVersionUID = 1L;

    private static final int max_days=1;  

    /**

     * @see HttpServlet#HttpServlet()

     */

    public GetP12Cert() {

        super();

        // TODO Auto-generated constructor stub

    }

 

/**

 * @see HttpServlet#doGet(HttpServletRequestrequest, HttpServletResponse response)

 */

protected void doGet(HttpServletRequestrequest, HttpServletResponse response) throws ServletException, IOException {

 String filename="C://Documents andSettings//Administrator//dlt.cer";

 String pass="ipcc@95598";

 Pkcs12Manager man=null;

 String alias="p12client";

 String keypass="123456";

 try{

  man=new Pkcs12Manager(new File(filename),pass);   

  man.updateExpiration(alias,keypass,max_days);

  exportCert(man,alias,response);

//   man.saveCert(alias,"123456");

  //man.saveCert(alias,"123456");

  

 }catch(Exception e){

  e.printStackTrace();

 }

}

 

// 导出证书

private void exportCert(Pkcs12Managerman,String alias,HttpServletResponse response){

 OutputStream out=null;

 try{

     Certificate cert = man.keyStore.getCertificate(alias);

     // 得到证书内容(以编码过的格式)

     byte[] buf = cert.getEncoded();

  // 写证书文件

     response.setContentType("application/x-download");  

     response.addHeader("Content-Disposition", "attachment;filename=" 

            + man.file.getName());  

     out= response.getOutputStream();

     out.write(buf);     

 }

 catch(Exception e){e.printStackTrace();}

 finally{

  try{

   out.close();

  }catch(Exception e){    

  }

 }

}

 

/**

 * @seeHttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

 */

protected voiddoPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {

 doGet(request,response);

}

 

}

其中,Pkcs12Manager是一个javabean,提供了对PKCS12证书的读取、修改操作,代码如下:

public class Pkcs12Manager {

    public File file;

    public KeyStore keyStore;

    private char[] storePass;

    public Pkcs12Manager(File file, String pass) throws IOException, Exception {

        this.file = file;

        this.storePass=pass.toCharArray();

        getKeyStore();// 加载KeyStore文件

    }

    // 加载KeyStore文件

    public synchronized KeyStore getKeyStore() throws IOException, Exception {

        if (keyStore == null) {

           FileInputStream fin = new FileInputStream(file);

           KeyStore store = KeyStore.getInstance("PKCS12");

            try {

               store.load(fin,storePass);               

           }

            finally {

               try {

                   fin.close();

               } catch (IOException e) { }

           }

            keyStore = store;

        }

        return keyStore;

    }

    // 读取alias指定的证书内容

public X509CertInfogetX509CertInfo(String alias)throws Exception {

 X509CertImpl cimp=getX509CertImpl(alias);

 //获取X509CertInfo对象

 return (X509CertInfo) cimp.get(X509CertImpl.NAME

    + "." + X509CertImpl.INFO);

}

    // 根据alias获取X509CertImpl对象

private X509CertImplgetX509CertImpl(String alias)throws Exception{

 Certificate c = keyStore.getCertificate(alias);// 读取证书

 // 从待签发的证书中提取证书信息  

 byte[] enc = c.getEncoded();//获取 证书内容(经过编码的字节)

 X509CertImpl cimp= new X509CertImpl(enc);//创建X509CertImpl

 return cimp;

}

// 修改证书过期时间:过期时间顺延n

public void updateExpiration(Stringalias,String keypass,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值