java加密和数字签名5 数字证书

来源:互联网 发布:真三国无双剧情知乎 编辑:程序博客网 时间:2024/05/17 09:13

转载:http://blog.csdn.net/jiangzhuzhu/article/details/5205050


最近初步接触了下Java加密和数字签名的相关内容,我学习的过程大概分五步:
1)消息摘要
2)私钥加密
3)公钥加密
4)数字签名
5)数字证书
下面的代码是第五部分:数字证书
比起前四部分,这部分就稍微麻烦点了,我想我有必要给刚刚接触数字证书的朋友们,把在本地跑通下面代码的前提说一下:
1此例是对“数字证书”文件的操作,所以,你先要在本地建立一个证书库

2建立证书库(密钥库)
cmd中输入:C:/>keytool -genkey -alias TestCertification -keyalg RSA -keysize 1024 -keystore BocsoftKeyLib -validity 365
意思是:在c盘目录下创建一个证书,指定证书库为BocsoftKeyLib,创建别名为TestCertification的一条证书,它指定用 RSA 算法生成,且指定密钥长度为1024,证书有效期为1年
建立库的过程中会询问问题,详见第5条

3将证书导出到证书文件TC.cer
在cmd中输入:C:/>keytool -export -alias TestCertification -file TC.cer -keystore BocsoftKeyLib
意思是:将把证书库BocsoftKeyLib中的别名为TestCertification的证书导出到TC.cer证书文件中,它包含证书主体的信息及证书的公钥,不包括私钥,可以公开

4以上3步就基本上完成了证书的操作,下面操作是可选的
导出的证书文件无法用文本编辑器正确显示,可以输入如下命令,然后在以记事本形式打开TC.cer就能看了,看看传说中的证书里到底写的什么鬼东西~~~
C:/>keytool -export -alias TestCertification -file TC.cer -keystore BocsoftKeyLib -storepass keystore -rfc

5在创建证书库时,系统会询问如下问题:
输入keystore密码:  keystore(你证书库的密码)
您的名字与姓氏是什么?
  [Unknown]:  miaozhuang
您的组织单位名称是什么?
  [Unknown]:  csii
您的组织名称是什么?
  [Unknown]:  csii
您所在的城市或区域名称是什么?
  [Unknown]:  tianjin
您所在的州或省份名称是什么?
  [Unknown]:  tianjin
该单位的两字母国家代码是什么
  [Unknown]:  ch
CN=miaozhuang, OU=csii, O=csii, L=tianjin, ST=tianjin, C=ch 正确吗?
  [否]:
上面的信息都是随便输入的,无关大局
此时输入: y 回车即可(别像我一样,输个yes……傻死了)


package security;import java.security.*;import java.security.PublicKey;import java.io.*;import java.util.*;import java.security.*;import java.security.cert.*;import sun.security.x509.*;import java.security.cert.Certificate;import java.security.cert.CertificateFactory;/** * 此例是对“数字证书”文件的操作 * java平台(在机器上安装jdk)为你提供了密钥库(证书库),cmd下提供了keytool命令就可以创建证书库 *  * 在运行此例前: * 在c盘目录下创建一个证书,指定证书库为BocsoftKeyLib,创建别名为TestCertification的一条证书,它指定用  * RSA 算法生成,且指定密钥长度为1024,证书有效期为1年 * 导出证书文件为TC.cer已存于本地磁盘C:/ * 密码是keystore */public class DigitalCertificate {    public static void main(String[] args) {        try {            //前提:将证书库中的一条证书导出到证书文件(我写的例子里证书文件叫TC.cer)            //从证书文件TC.cer里读取证书信息            /*CertificateFactory cf = CertificateFactory.getInstance("X.509");            FileInputStream in = new FileInputStream("C:/TC.cer");            //将文件以文件流的形式读入证书类Certificate中            Certificate c = cf.generateCertificate(in);            System.err.println("转换成String后的证书信息:"+c.toString());*/                                    //或者不用上面代码的方法,直接从证书库中读取证书信息,和上面的结果一摸一样            String pass="keystore";               FileInputStream in2=new FileInputStream("C:/BocsoftKeyLib");               KeyStore ks=KeyStore.getInstance("JKS");               ks.load(in2,pass.toCharArray());            String alias = "TestCertification"; //alias为条目的别名            Certificate c=ks.getCertificate(alias);            System.err.println("转换成String后的证书信息:"+c.toString());                                    //获取获取X509Certificate类型的对象,这是证书类获取Certificate的子类,实现了更多方法            X509Certificate t=(X509Certificate)c;            //从信息中提取需要信息            System.out.println("版本号:"+t.getVersion());               System.out.println("序列号:"+t.getSerialNumber().toString(16));               System.out.println("主体名:"+t.getSubjectDN());               System.out.println("签发者:"+t.getIssuerDN());               System.out.println("有效期:"+t.getNotBefore());               System.out.println("签名算法:"+t.getSigAlgName());               byte [] sig=t.getSignature();//签名值            PublicKey pk = t.getPublicKey();             byte [] pkenc=pk.getEncoded();               System.out.println("公钥:");               for(int i=0;i<pkenc.length;i++){                System.out.print(pkenc[i]+",");               }            System.err.println();                                    //证书的日期有效性检查,颁发的证书都有一个有效性的日期区间            Date TimeNow=new Date();                  t.checkValidity(TimeNow);               System.out.println("证书的日期有效性检查:有效的证书日期!");                           //验证证书签名的有效性,通过数字证书认证中心(CA)机构颁布给客户的CA证书,比如:caroot.crt文件            //我手里没有CA颁给我的证书,所以下面代码执行不了            /*FileInputStream in3=new FileInputStream("caroot.crt");               //获取CA证书            Certificate cac = cf.generateCertificate(in3);               //获取CA的公钥               PublicKey pbk=cac.getPublicKey();               //c为本地证书,也就是待检验的证书,用CA的公钥校验数字证书c的有效性            c.verify(pbk);*/                                } catch(CertificateExpiredException e){//证书的日期有效性检查:过期               System.out.println("证书的日期有效性检查:过期");              } catch(CertificateNotYetValidException e){ //证书的日期有效性检查:尚未生效               System.out.println("证书的日期有效性检查:尚未生效");           } catch (CertificateException ce) {            ce.printStackTrace();        } catch (FileNotFoundException fe) {            fe.printStackTrace();        } /*catch (IOException ioe){                    } catch (KeyStoreException kse){                    }*/ catch (Exception e){            e.printStackTrace();        }    }}