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

最近初步接触了下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();
        }

    }
}

你可能感兴趣的:(java,C++,c,C#,Security)