一、前言
使用自签ca证书,给二级ca签发生成的证书默认不具备给三级证书签发的能力。
需要指定 -extensions v3_ca参数。
详细参考: http://blog.csdn.net/howeverpf/article/details/21622545?reload
二 相关命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// 生成顶级CA的公钥证书和私钥文件,有效期10年(RSA 1024bits,默认)
openssl req -new -x509 -days 3650 -keyout CARoot.key -out CARoot.crt
// 为顶级CA的私钥文件去除保护口令
openssl rsa -in CARoot.key -out CARoot.key
// 为应用证书/中级证书生成私钥文件
openssl genrsa -out roota.key 1024
// 根据私钥文件,为应用证书/中级证书生成 csr 文件(证书请求文件)
openssl req -new -key roota.key -out roota.csr
// 使用CA的公私钥文件给 csr 文件签名,生成中级证书,有效期5年
openssl ca -extensions v3_ca -in roota.csr -out roota.crt -cert CARoot.crt -keyfile CARoot.key -days 1826 -policy policy_anything
//生成服务rootb
openssl genrsa -out rootb.key 1024
openssl req -new -key rootb.key -out rootb.csr
openssl ca -extensions v3_ca -in rootb.csr -out rootb.crt -cert CARoot.crt -keyfile CARoot.key -days 1826 -policy policy_anything
///生成服务roota-1
openssl genrsa -out roota-1.key 1024
openssl req -new -key roota-1.key -out roota-1.csr
openssl ca -in roota-1.csr -out roota-1.crt -cert roota.crt -keyfile roota.key -days 1826 -policy policy_anything
///生成p12
openssl pkcs12 -export -clcerts -in roota-1.crt -inkey roota-1.key -out roota-1.p12
//p12转jks
keytool -importkeystore -srckeystore roota-1.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore roota-1.jks
///生成客户端rootb-1
openssl genrsa -out rootb-1.key 1024
openssl req -new -key rootb-1.key -out rootb-1.csr
openssl ca -in rootb-1.csr -out rootb-1.crt -cert rootb.crt -keyfile rootb.key -days 1826 -policy policy_anything
///生成p12
openssl pkcs12 -export -clcerts -in roota-1.crt -inkey roota-1.key -out roota-1.p12
//p12转jks
keytool -importkeystore -srckeystore roota-1.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore roota-1.jks
//服务端导入信任
keytool -import -alias root -file CARoot.crt -keystore roota-1.jks
keytool -import -alias rootb -file rootb.crt -keystore roota-1.jks //报错不是x509格式
//转为x509
openssl x509 -in rootb.crt -out -rootb.cer
keytool -import -alias rootb -file rootb.cer -keystore roota-1.jks
//cn为ip地址172.20.186.196 roota-2
///生成服务roota-2
openssl genrsa -out roota-2.key 1024
openssl req -new -key roota-2.key -out roota-2.csr
openssl ca -in roota-2.csr -out roota-2.crt -cert roota.crt -keyfile roota.key -days 1826 -policy policy_anything
///生成p12
openssl pkcs12 -export -clcerts -in roota-2.crt -inkey roota-2.key -out roota-2.p12
//p12转jks
keytool -importkeystore -srckeystore roota-2.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore roota-2.jks
keytool -import -alias root -file CARoot.crt -keystore roota-2.jks
keytool -import -alias rootb -file rootb.cer -keystore roota-2.jks
三 可能出现的问题
1 找不到xx路径或文件,参考 http://www.cnblogs.com/rusty/archive/2011/03/31/2001443.html
在当前目录下创建demoCA文件夹,其中新建一个空的index.txt(原文说要清空内容,windows下测试不需要,如果有问题,可尝试清空内容)和一个serial文件,serial文件中放个数字(最好别是0,最好以0开头,比如01)
2 给二级证书签名时,发生name=group=unique_subject
配置文件openssl.cfg中default_md = md5
四 证书使用
1 客户端验证服务器证书roota-1
客户端需要安装 根证书CARoot.crt和二级证书roota.crt
应用服务器tomcat或jboss的server.xml中ssl配置:keystoreFile指向roota-1.jks(由roota签发)
2 服务器验证客户端
客户端需按装rootb-1.p12(含有秘钥)的证书,由rootb签发
应用服务器tomcat或jboss的server.xml中ssl配置:truststoreFile指定的jks文件,需要导入公钥根证书CARoot.crt和二级证书rootb.crt
五证书链验证过程
接收到对方发来的证书,提取该证书的签发人,查询自身证书列表,追溯到根证书,得到接收证书到根证书的路径,获取根证书公钥,沿着路径验证二级证书,获取二级证书公钥沿路径验证三级证书,依次进行。