赞
踩
一 。证书类型
1》证书概念:
证书是对现实生活中 某个人或者某件物品的价值体现 比如古董颁发见证书 ,人颁发献血证等 通常证书会包含以下内容
证书拥有者名称(CN),组织单位(OU)组织(O),城市(L) 区(ST) 国家/地区( C )
证书的过期时间 证书的颁发机构 证书颁发机构对证书的签名,签名算法,对象的公钥等
数字证书的格式遵循X.509标准。X.509是由国际电信联盟(ITU-T)制定的数字证书标准。
2》证书类型(表格采集自网络)
格式 | 扩展名 | 描述 | 特点 |
DER | .cer/.crt/.rsa | 【ASN .1 DER】用于存放证书 | 不含私钥、二进制 |
PKCS7 | .p7b/.p7r | 【PKCS #7】加密信息语法标准 | 1、p7b以树状展示证书链,不含私钥 |
CMS | .p7c/.p7m/.p7s | 【Cryptographic Message Syntax】 | 1、p7c只保存证书 |
PEM | .pem | 【Printable Encoded Message】 | 1、该编码格式在RFC1421中定义,其实PEM是 【Privacy-Enhanced Mail】的简写,但他也同样广泛运用于密钥管理 |
PKCS10 | .p10/.csr | 【PKCS #10】公钥加密标准【Certificate Signing Request】 | 1、证书签名请求文件 |
SPC | .pvk/.spc | 【Software Publishing Certificate】 | 微软公司特有的双证书文件格式,经常用于代码签名,其中
|
二。密钥库类型
1》公私密钥和证书理解
1.鲍勃有两把钥匙,一把是公钥,另一把是私钥。
2.鲍勃把公钥送给他的朋友们—-帕蒂、道格、苏珊—-每人一把。
3.苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果。
4.鲍勃收信后,用私钥解密,看到信件内容。
5.鲍勃给苏珊回信,写完后用Hash函数,生成信件的摘要(digest)。
6.然后,鲍勃使用私钥,对这个摘要加密,生成”数字签名”(signature)。
7.鲍勃将这个签名,附在信件下面,一起发给苏珊。
8.苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。
9.苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。
10.复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。因此,他就可以冒充鲍勃,写信给苏珊。
11.苏珊发现,自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找”证书中心”(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成”数字证书”(Digital Certificate)。
12.鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。
13.苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明”数字签名”是否真的是鲍勃签的。
2》秘钥库概念:所有的公钥和私钥同证书都会被存储在密钥库中 因为证书需要被签名 签名必须使用非对称加密算法+HASH算法 所以
一般是MD5WithRSA或者 SHA1WithRSA (表格采集自网络)
格式 | 扩展名 | 描述 | 特点 |
JKS | .jks/.ks | 【Java Keystore】密钥库的Java实现版本,provider为SUN | 密钥库和私钥用不同的密码进行保护 |
JCEKS | .jce | 【JCE Keystore】密钥库的JCE实现版本,provider为SUN JCE | 相对于JKS安全级别更高,保护Keystore私钥 时采用TripleDES |
PKCS12 | .p12/.pfx | 【PKCS #12】个人信息交换语法标准 | 1、包含私钥、公钥及其证书 |
BKS | .bks | 【Bouncycastle Keystore】密钥库的BC实现版本,provider为BC | 基于JCE实现 |
UBER | .ubr | 【Bouncycastle UBER Keystore】密钥库的BC更安全实现版本,provider为BC |
|
三。使用java的keytool生成证书
生成证书以及证书对应的公钥和私钥都可以被存储在秘钥库中 同一个秘钥库中可以存储多个证书 秘钥库必须设置一个访问的口令 防止被盗
证书中包含公钥 证书和私钥如果需要单独存储 需要分开在不同的文件 也可以放在同一个秘钥库中
- 秘钥库可以单独存储证书条目(trustedCertEntry) 表示信任的证书,
- 秘钥库可以存储生成的证书和私钥(PrivateKeyEntry)
keytool /?查看所有的子命令
C:\Users\jiaozi>keytool 密钥和证书管理工具 命令: -certreq 生成证书请求 -changealias 更改条目的别名 -delete 删除条目 -exportcert 导出证书 -genkeypair 生成密钥对 -genseckey 生成密钥 -gencert 根据证书请求生成证书 -importcert 导入证书或证书链 -importkeystore 从其他密钥库导入一个或所有条目 -keypasswd 更改条目的密钥口令 -list 列出密钥库中的条目 -printcert 打印证书内容 -printcertreq 打印证书请求的内容 -printcrl 打印 CRL 文件的内容 -storepasswd 更改密钥库的存储口令
keytool -genkeypair /?查看genkeypair的子命令
- C:\Users\jiaozi>keytool -genkeypair /?
- 非法选项: \a
- keytool -genkeypair [OPTION]...
- 生成密钥对
- 选项:
- -alias <alias> 要处理的条目的别名
- -keyalg <keyalg> 密钥算法名称
- -keysize <keysize> 密钥位大小
- -sigalg <sigalg> 签名算法名称
- -destalias <destalias> 目标别名
- -dname <dname> 唯一判别名
- -startdate <startdate> 证书有效期开始日期/时间
- -ext <value> X.509 扩展
- -validity <valDays> 有效天数
- -keypass <arg> 密钥口令
- -keystore <keystore> 密钥库名称
- -storepass <arg> 密钥库口令
- -storetype <storetype> 密钥库类型
- -providername <providername> 提供方名称
- -providerclass <providerclass> 提供方类名
- -providerarg <arg> 提供方参数
- -providerpath <pathlist> 提供方类路径
- -v 详细输出
- -protected 通过受保护的机制的口令
常用的命令
》》keytool -genkeypair -alias 被存储在秘钥库的证书名称 -keystore 证书的位置(默认当前工作目录下 文件名 .keystore) -storepass 密钥库的口令
-validity 有效期的天数 -keypass 秘钥口令
例如(输入证书拥有者个人信息)
keytool -genkeypair -keystore c:/a.keystore -alias test
再增加一个证书
keytool -genkeypair -keystore c:/a.keystore -alias test1
》》查看密钥库的证书列表(密续输入秘钥库的密码才能查看) java默认的密钥库为JKS
- keytool -list -keystore c:/a.keystore -storepass 123456
-
- 密钥库类型: JKS
- 密钥库提供方: SUN
-
- 您的密钥库包含 2 个条目
-
- test, 2017-7-24, PrivateKeyEntry,
- 证书指纹 (SHA1): DD:34:11:3F:2C:D8:6B:4D:71:F5:C9:40:E9:91:7E:A9:9A:C5:9E:9D
- test1, 2017-7-24, PrivateKeyEntry,
- 证书指纹 (SHA1): C0:E8:B5:ED:0F:CD:95:4B:13:C3:19:78:AE:65:F1:A7:1E:63:E8:B9
》》导出证书到单独证书文件(可以导出别名为test或者test1的证书)
- C:\Users\jiaozi>keytool -exportcert -alias test -file c:/a.cer -keystore c:/a.k
- eystore -storepass 123456
- 存储在文件 <c:/a.cer> 中的证书
》》添加证书到秘钥库中
- C:\Users\jiaozi>keytool -importcert -alias test2 -file c:/a.cer -keystore c:/a.
- keystore -storepass 123456
- 在别名 <test> 之下, 证书已经存在于密钥库中
- 是否仍要添加? [否]: y
- 证书已添加到密钥库中
-
- C:\Users\jiaozi>keytool -list -keystore c:/a.keystore -storepass 123456
- 密钥库类型: JKS
- 密钥库提供方: SUN
- 您的密钥库包含 3 个条目
- test, 2017-7-24, PrivateKeyEntry,
- 证书指纹 (SHA1): C0:E8:B5:ED:0F:CD:95:4B:13:C3:19:78:AE:65:F1:A7:1E:63:E8:B9
- test1, 2017-7-24, PrivateKeyEntry,
- 证书指纹 (SHA1): DD:34:11:3F:2C:D8:6B:4D:71:F5:C9:40:E9:91:7E:A9:9A:C5:9E:9D
- test2, 2017-7-24,trustedCertEntry ,
- 证书指纹 (SHA1): C0:E8:B5:ED:0F:CD:95:4B:13:C3:19:78:AE:65:F1:A7:1E:63:E8:B9
》》数据证书签发申请 csr
首先 假设生成一个根证书 默认是自己颁发给自己也就是自签名证书
- C:\Users\jiaozi>keytool -genkeypair -keystore c:/root.keystopre
- 输入密钥库口令:
- 再次输入新口令:
- 您的名字与姓氏是什么?
- [Unknown]: jiaozi
- 您的组织单位名称是什么?
- [Unknown]: yt
- 您的组织名称是什么?
- [Unknown]: ytgroup
- 您所在的城市或区域名称是什么?
- [Unknown]: zh_CN
- 您所在的省/市/自治区名称是什么?
- [Unknown]: gd
- 该单位的双字母国家/地区代码是什么?
- [Unknown]: china
- CN=jiaozi, OU=yt, O=ytgroup, L=zh_CN, ST=gd, C=china是否正确?
- [否]: y
-
- 输入 <mykey> 的密钥口令
- (如果和密钥库口令相同, 按回车):
-
- C:\Users\jiaozi>keytool -list -keystore c:/root.keystopre
- 输入密钥库口令:
-
- 密钥库类型: JKS
- 密钥库提供方: SUN
-
- 您的密钥库包含 1 个条目
-
- mykey, 2017-7-24, PrivateKeyEntry,
- 证书指纹 (SHA1): 0F:E3:40:B2:B8:D0:7A:D2:91:7D:CC:E5:38:16:96:D8:C8:FF:05:E0
使用该证书签发其他的证书
1》创建一个需要被root签名的证书 同上(默认的别名是mykey 输入名字和姓氏为p2p)
keytool -genkeypair -keystore c:/my.keystopre
2》创建证书请求(也就是将my.keystore中创建的证书 进行签名请求 该文件时csr文件)
keytool -certreq -alias mykey -keystore c:\my.keystore -file c:\my.csr
3》需要将my.csr 通过root.keystore证书签名 生成新的证书
keytool -gencert -alias mykey -keystore c:\root.keystore -infile c:\my.csr -outfil
e c:\my.cer
双击my.cer可以看到 确实是根证书的jiaozi颁发给了被签名证书的p2p
证书路径确没有显示正确的结构 应该是jiaozi下的子节点是p2p 这里是因为根节点没有被系统信任
需要将根证书导入到系统受信任的颁发机构中 以后所有根证书签发的证书都是被信任的
导出root.keystore中的根证书
keytool -exportcert -keystore root.keystore -file c:\rootca.cer
设置如下:
打开chrome浏览器 选择 选项或者设置 点击高级 管理证书选项 点开 收信任的根证书颁发机构 点击左下角导入 下一步 选择 被签名的
导入成功后可以看到
》》给jar包签名(jarsigner -keystore c:\root.keystore 被签名jar的路径 keystore中的别名)
jarsigner -keystore c:\root.keystore ref.jar mykey 签名后META-INF 会生成一些文件 其实就是对类进行的摘要 这个会直接在jar包本省签名
-signedjar ref1.jar 可以指定生成一个新的jar包
》》其他命令 比如从密钥库删除条目等参考帮助
四。使用java编码操作证书和密钥库
JKS和PKCS 会抛出错误 不支持单独秘钥 keyStore.setKeyEntry("key1", sk, "123456".toCharArray(), null); //存储信任的证书 InputStream is=new FileInputStream("c:/a.cer"); CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509Certificate cert = (X509Certificate)cf.generateCertificate(is); keyStore.setCertificateEntry("cert1", cert); //存储非对称加密的证书和私钥 CertAndKeyGen gen = new CertAndKeyGen("RSA","SHA1WithRSA"); gen.generate(1024); X509Certificate mycert=gen.getSelfCertificate(new X500Name("CN=ROOT"), (long)365*24*3600); PrivateKey pk=gen.getPrivateKey(); keyStore.setKeyEntry("myrsa", pk, "123456".toCharArray(),new Certificate[]{ mycert}); keyStore.store(new FileOutputStream("c:/ttt.keystore"), "123456".toCharArray()); }
/** *java默认密钥库为jks 支持PKCS12,JCEKS等 *JCEKS支持 秘钥 支持信任证书和私钥 *JKS和PKCS支持信任证书和私钥 不支持单独秘钥 * @throws NoSuchAlgorithmException */ public static void main(String[] args) throws Exception { KeyStore keyStore = KeyStore.getInstance("JCEKS"); keyStore.load(null,null); KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128);//128, 192 or 256 SecretKey sk=keyGen.generateKey(); //单独只是存储一个秘钥 如果是JKS和PKCS 会抛出错误 不支持单独秘钥 keyStore.setKeyEntry("key1", sk, "123456".toCharArray(), null); //存储信任的证书 InputStream is=new FileInputStream("c:/a.cer"); CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509Certificate cert = (X509Certificate)cf.generateCertificate(is); keyStore.setCertificateEntry("cert1", cert); //存储非对称加密的证书和私钥 CertAndKeyGen gen = new CertAndKeyGen("RSA","SHA1WithRSA"); gen.generate(1024); X509Certificate mycert=gen.getSelfCertificate(new X500Name("CN=ROOT"), (long)365*24*3600); PrivateKey pk=gen.getPrivateKey(); keyStore.setKeyEntry("myrsa", pk, "123456".toCharArray(),new Certificate[]{ mycert}); keyStore.store(new FileOutputStream("c:/ttt.keystore"), "123456".toCharArray()); }
使用命令查看秘钥库
- C:\Users\jiaozi>keytool -list -keystore c:/ttt.keystore -storepass 123456 -storetype JCEKS
-
- 密钥库类型: JCEKS
- 密钥库提供方: SunJCE
-
- 您的密钥库包含 3 个条目
-
- myrsa, 2017-7-24, PrivateKeyEntry,
- 证书指纹 (SHA1): 82:C1:A5:10:4A:B1:6A:DC:88:01:88:FF:79:73:B7:B0:47:B6:F1:95
- key1, 2017-7-24, SecretKeyEntry,
- cert1, 2017-7-24, trustedCertEntry,
- 证书指纹 (SHA1): C0:E8:B5:ED:0F:CD:95:4B:13:C3:19:78:AE:65:F1:A7:1E:63:E8:B9
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。