数字证书好比人的身份证。可以用证书像别人证明自己的身份一样。
分两种场合:
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 输入<abnerCA>的主密码 |
查看证书:
E:\work\balanceofworld\balance\balance.security>keytool -list -keystore abnerCALib Keystore 类型: jks 您的 keystore 包含 1 输入 abnerca, 2009-11-10, keyEntry, |
又如: 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> |
上面导出的证书文件是以二进制编码文件,无法用文本编辑器正确显示,因此不利用公布证书,可以加上 -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(); } } }