JAVA 机密机制初探(JCA)—— 安全证书

数字证书好比人的身份证。可以用证书像别人证明自己的身份一样。

 

分两种场合:

1,实名买火车票,需要权威的机构(公安局)帮你办的身份证做实名认证。身份证好比数字证书。

这种情况需要权威的机构,比方说是(CA ,Certificate Authority),如VerSign(www.versign.org)和Thawte(www.thawte.comm)颁发。

2,领工资,我只关心能领导如实数目的工资,当然也不含假钞。我可能并不关心这个工资是谁发给我的。

这种情况就可以只创建自我签名的证书,可以通过JDK自带的keytool来创建。

 

keytool 参数说明:

A.genkey: 生成一对非对称密钥

B.alias :取个别名,以后操作这个证书的时候都通过别名来操作

C.keyalg : 指定加密算法

D.keystore : 指定安全证书的存放路径

E.storepass:打开keystore所需要的密码

F.keypass:设置存储在keystore中密钥对的密码
G.validity:有效时间,单位是天(上例中即为180天)

 

如下图,利用JDK自带的keytool生成数字签名:

 

E:\work\balanceofworld\balance\balance.security>keytool -genkey -alias abnerCA -keyalg RSA -keysize 1024 -keystore abner
CALib -validity 3650
输入keystore密码:  800528
您的名字与姓氏是什么?
  [Unknown]:  亚军
您的组织单位名称是什么?
  [Unknown]:  爱的小屋
您的组织名称是什么?
  [Unknown]:  爱的小屋
您所在的城市或区域名称是什么?
  [Unknown]:  滨江区
您所在的州或省份名称是什么?
  [Unknown]:  浙江省
该单位的两字母国家代码是什么
  [Unknown]:  CN
CN=亚军, OU=爱的小屋, O=爱的小屋, L=滨江区, ST=浙江省, C=CN 正确吗?
  [否]:  y

输入<abnerCA>的主密码
        (如果和 keystore 密码相同,按回车):

 

 查看证书:

 

E:\work\balanceofworld\balance\balance.security>keytool -list -keystore abnerCALib
输入keystore密码:  800528

Keystore 类型: jks
Keystore 提供者: SUN

您的 keystore 包含 1 输入

abnerca, 2009-11-10, keyEntry,
认证指纹 (MD5): 58:DD:1B:BF:46:93:21:48:F4:E5:4B:B0:A9:F6:1B:18

 

又如: keytool -list -alias abnerCA -keystore abnerCALib

将显示 abnerCALib证书库中别名为abnerCA的证书的信息。如下图所示:

 

 

E:\work\balanceofworld\balance\balance.security>keytool -list -alias abnerCA -keystore abnerCALib
输入keystore密码:  800528
abnerCA, 2009-11-10, keyEntry,
认证指纹 (MD5): 58:DD:1B:BF:46:93:21:48:F4:E5:4B:B0:A9:F6:1B:18

 

又如: keytool -list -v -alias abnerCA -keystore abnerCALib

将显示证书的详细信息( -v参数)如下图所示:
 

 

E:\work\balanceofworld\balance\balance.security>keytool -list -v -alias abnerCA -keystore abnerCALib
输入keystore密码:  800528
别名名称: abnerCA
创建日期: 2009-11-10
输入类型:KeyEntry
认证链长度: 1
认证 [1]:
Owner: CN=亚军, OU=爱的小屋, O=爱的小屋, L=滨江区, ST=浙江省, C=CN
发照者: CN=亚军, OU=爱的小屋, O=爱的小屋, L=滨江区, ST=浙江省, C=CN
序号: 4af96666
有效期间: Tue Nov 10 21:11:02 CST 2009 至: Fri Nov 08 21:11:02 CST 2019
认证指纹:
         MD5:  58:DD:1B:BF:46:93:21:48:F4:E5:4B:B0:A9:F6:1B:18
         SHA1: 83:A0:86:47:D2:26:C9:44:1B:ED:4E:BA:45:BC:62:FE:C4:E8:54:13

 

如: keytool -export -alias abnerCA -file abnerCA.cer -keystore abnerCALib
  将把证书库 abnerCALib中的别名为abnerCA的证书导出到abnerCA.cer证书文件中,

  它包含证书主体的信息及证书的公钥,不包括私钥,可以公开,如下图所示 :

 

 

E:\work\balanceofworld\balance\balance.security>keytool -export -alias abnerCA -file abnerCA.cer -keystore abnerCALib
输入keystore密码:  800528
保存在文件中的认证 <abnerCA.cer>


JAVA 机密机制初探(JCA)—— 安全证书_第1张图片

 

上面导出的证书文件是以二进制编码文件,无法用文本编辑器正确显示,因此不利用公布证书,可以加上 -rfc参数以一种可打印的编者编码输出。

 

E:\work\balanceofworld\balance\balance.security>keytool -export -alias abnerCA -file abnerCA.cer -keystore abnerCALib -s
torepass 800528 -rfc
保存在文件中的认证 <abnerCA.cer>


其他一些功能:

 

keytool的命令行参数-delete可以删除密钥库中的条目,

如: keytool -delete -alias abnerCA -keystore abnerCALib

  这条命令将 abnerCALib库中的abnerCA这一条证书删除了。

  

 证书条目口令的修改

  如: keytool –keypasswd –alias abnerCA –keystore abnerCALib


可以以交互的方式修改 abnerCALib证书库中的条目为abnerCA的证书。


Keytool –keypasswd –alias abnerCA –keypass 123456 –new 200100 –storepass 800528 –keystore abnerCALib 

 

详见:http://blog.csdn.net/CYHJRX/archive/2009/02/17/3899577.aspx

 

 

读取以上生成的证书文件的代码:

package com.yajun.certificate;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateExpiredException;
import java.security.cert.CertificateFactory;
import java.security.cert.CertificateNotYetValidException;
import java.security.cert.X509Certificate;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;

public class CerCertificateReader {

    public static void main(String[] args) {
        try {
            // =============== 读取生成的本地证书文件 ===========
            String pass = "800528";
            FileInputStream in2 = new FileInputStream("E:\\work\\balanceofworld\\balance\\balance.security\\abnerCALib");
            KeyStore ks = KeyStore.getInstance("JKS");
            ks.load(in2, pass.toCharArray());

            String alias = "abnerCA"; // alias为条目的别名
            // 获取私钥文件
            PrivateKey privateKey = (PrivateKey) ks.getKey(alias, pass.toCharArray());
            System.out.println(privateKey);
            Certificate c = ks.getCertificate(alias);
            System.out.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("证书的日期有效性检查:有效的证书日期!");

            // ======================== 读取 cer 证书文件(改证书文件时可以公布出去的,不包含私钥的) ===========================
            FileInputStream fis = new FileInputStream(
                                                      "E:\\work\\balanceofworld\\balance\\balance.security\\abnerCA.cer");
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            Collection c1 = cf.generateCertificates(fis);
            Iterator i = c1.iterator();
            while (i.hasNext()) {
                Certificate cert = (Certificate) i.next();
                System.out.println(cert);
            }

        } catch (CertificateExpiredException e) {// 证书的日期有效性检查:过期
            System.out.println("证书的日期有效性检查:过期");
        } catch (CertificateNotYetValidException e) { // 证书的日期有效性检查:尚未生效
            System.out.println("证书的日期有效性检查:尚未生效");
        } catch (CertificateException ce) {
            ce.printStackTrace();
        } catch (FileNotFoundException fe) {
            fe.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

 

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