使用Openssl创建私有CA中心的整体步骤:
1、生成root ca,再根据roo.ca生成intermediate CAs,最佳实践是,不要让root.ca直接去签名,而是让intermediate CAs 去签名,生成root.ca的机器最好isolated,以免私钥丢失。
1.1、准备root证书放的地儿专门保存私钥和证书
mkdir /root/ca
cd /root/ca
mkdir certs crl newcerts private
chmod 700 private
touch index.txt
echo 1000 > serial
index.txt and serial files 用于记录证书签名的跟踪.
1.2、必须使用一个配置文件给openssl来使用,保存的名字位于/root/ca/openssl.cnf,附:https://jamielinux.com/docs/openssl-certificate-authority/appendix/root-configuration-file.html
1.3、创建root CA的私钥key, 使用aes256加密key文件,私钥文件为4096位。
# cd /root/ca
# openssl genrsa -aes256 -out private/ca.key.pem 4096
-------会提示让你输密码-------
# chmod 400 private/ca.key.pem
1.4、创建root CA的公钥certificate,使用私钥去生成公钥,失效日期设置长一点(eg:20 years)
# cd /root/ca
# openssl req -config openssl.cnf \
-key private/ca.key.pem \
-new -x509 -days 7300 -sha256 -extensions v3_ca \
-out certs/ca.cert.pem
------会提示你输入相关信息--------
# chmod 444 certs/ca.cert.pem
使用-config来指定我们之前下载的配置模板,否则将使用默认的模板,位于/etc/pki/tls/openssl.cnf
1.5、校验生成的公钥是否是我们想要的
#openssl x509 -noout -text -in certs/ca.cert.pem
2、生成intermediate pairs,intermediate CA可以代表root CA去给第三方做签名,root CA签名intermediate CA, 结果会形成一个信任链chain of trust
2.1、准备目录
# mkdir /root/ca/intermediate
# cd /root/ca/intermediate
# mkdir certs crl csr newcerts private
# chmod 700 private
# touch index.txt
# echo 1000 > serial
相比root ca多了一个csr目录,主要用于保存证书签名请求。
# echo 1000 > /root/ca/intermediate/crlnumber
创建一个crlnumber文件,主要用于证书吊销列表的追踪。
2.2、准备配置文件为/root/ca/intermediate/openssl.cnf, 配置文件模板为https://jamielinux.com/docs/openssl-certificate-authority/appendix/intermediate-configuration-file.html
主要有五个选项需要变一下:
[ CA_default ]
dir = /root/ca/intermediate
private_key = $dir/private/intermediate.key.pem
certificate = $dir/certs/intermediate.cert.pem
crl = $dir/crl/intermediate.crl.pem
policy = policy_loose
root.ca中的policy是policy_strict是指它只签名intermediate,而intermediate是loose是允许他去签名更多的其他证书。
2.3、创建intermediate私钥,和root ca一样的命令
# cd /root/ca
# openssl genrsa -aes256 \
-out intermediate/private/intermediate.key.pem 4096
-----提示输入保护密码----
# chmod 400 intermediate/private/intermediate.key.pem
2.4、使用intermediate 私钥去创建一个certificate signing request (CSR)
# cd /root/ca
# openssl req -config intermediate/openssl.cnf -new -sha256 \
-key intermediate/private/intermediate.key.pem \
-out intermediate/csr/intermediate.csr.pem
---------会输出很多让你输入的信息,除了Common Name和root ca时不一样,其他最好保持一致----------
注意以上使用的是intermediate的配置文件,以下则是使用root ca 的配置文件,with v3_intermediate_ca extension去签名以上生成的CSR,并生成签名后的intermediate公钥证书:
# cd /root/ca
# openssl ca -config openssl.cnf -extensions v3_intermediate_ca \
-days 3650 -notext -md sha256 \
-in intermediate/csr/intermediate.csr.pem \
-out intermediate/certs/intermediate.cert.pem
# chmod 444 intermediate/certs/intermediate.cert.pem
以上命令完后,会在运行openssl ca命令时的目录(/root/ca)下的index.txt下生成类似以下信息,不要删除:V 250408122707Z 1000 unknown ... /CN=Alice Ltd Intermediate CA
2.5、验证intermediate证书的细节是否正确:
# openssl x509 -noout -text \
-in intermediate/certs/intermediate.cert.pem
然后再验证intermediate证书的是否被root ca正确签名:
# openssl verify -CAfile certs/ca.cert.pem \
intermediate/certs/intermediate.cert.pem
2.6、创建一个证书链文件,主要用于一个应用程序,例如浏览器要认证intermediate证书的有效签发机构是不是root ca(假设浏览器信任root ca)
# cat intermediate/certs/intermediate.cert.pem \
certs/ca.cert.pem > intermediate/certs/ca-chain.cert.pem
# chmod 444 intermediate/certs/ca-chain.cert.pem
证书链文件必须包含root ca的certification,并且在每台内部客户端安装root公钥证书.
3、利用intermediate CA去签名平时使用的server和client,如果是第三方给你的话,人家只需要给你CSR即可,你给CSR签名就行了。以下是从自己内部的角度来一步一步操作。
3.1、在server端创建key私钥,尽管root 和 intermediate pair是4096bit,但是给server和client签名时最好是2048bit,减少TLS握手时性能压力。
# cd /root/ca
# openssl genrsa -aes256 \
-out intermediate/private/www.example.com.key.pem 2048
# chmod 400 intermediate/private/www.example.com.key.pem
如果使用apache,每次启动都要输入保护私钥的密码,如果不想输入密码,就去掉-aes256。
3.2、使用key私钥去生成一个CSR证书(说白了就是未签名的公钥证书),
# cd /root/ca
# openssl req -config intermediate/openssl.cnf \(使用intermediate的私钥去生成server的公钥?错了吧,也许这里面的intermediate相当于第三方自己的内部CA,pending....)
-key intermediate/private/www.example.com.key.pem \
-new -sha256 -out intermediate/csr/www.example.com.csr.pem
----输出一堆信息让你填,你不需要和intermediate的相对应,但common name时填写网站全名,如果是client的话,最好填邮箱信息-----
3.3、使用intermediate证书去签名server或client的CSR并生成签名后证书,证书通常一年
# cd /root/ca
# openssl ca -config intermediate/openssl.cnf \
-extensions server_cert -days 375 -notext -md sha256 \
-in intermediate/csr/www.example.com.csr.pem \
-out intermediate/certs/www.example.com.cert.pem
# chmod 444 intermediate/certs/www.example.com.cert.pem
如果是去签名一个client,则改成-extensions usr_cert
最后会在intermediate/index.txt文件中生成一条类似于如下信息: V 160420124233Z 1000 unknown ... /CN=www.example.com
3.4、校验生成的证书信息是否正确
# openssl x509 -noout -text \
-in intermediate/certs/www.example.com.cert.pem
3.5、使用之前intermediate时创建的证书链文件校验是否ok
# openssl verify -CAfile intermediate/certs/ca-chain.cert.pem \
intermediate/certs/www.example.com.cert.pem
3.6、部署证书,这里假设是apache,以下文件需要
ca-chain.cert.pem
www.example.com.key.pem
www.example.com.cert.pem
如果是给第三方做签名的话,只需要给他们ca-chain.cert.pem和
www.example.com.cert.pem,因为他们让你做签名时,不会把私钥给你的。
4、证书撤消列表CRLs,主要用来客户端程序(eg: IE)使用CRL去验证一个证书是否被撤消,服务器也可以使用CRLs限制拥有无效证书的客户端连接。目前CRLs这种方式已经被Online Certificate Status Protocol (OCSP)取代,所以这里喜新不喜旧。
OCSP server address 通常会在证书里面指定。
4.1、OCSP准备配置文件,在intermediate CA的配置文件中指定,因为要使用intermediate CA做签名
[ server_cert ]
# ... snipped ...
authorityInfoAccess = OCSP;URI:http://ocsp.example.com
4.2、创建OCSP密钥对,OCSP responder需要使用该密钥对加密回复requesting party, 必须使用证书的拥有者相同的CA签名
生成私钥:
# cd /root/ca
# openssl genrsa -aes256 \
-out intermediate/private/ocsp.example.com.key.pem 4096
根据私钥生成CSR:
# cd /root/ca
# openssl req -config intermediate/openssl.cnf -new -sha256 \
-key intermediate/private/ocsp.example.com.key.pem \
-out intermediate/csr/ocsp.example.com.csr.pem
-----输出很多信息需要填,最好和要使用的签名CA时的信息一样,Common name是全域名------
使用intermediate CA去签名该CSR:
# openssl ca -config intermediate/openssl.cnf \
-extensions ocsp -days 375 -notext -md sha256 \
-in intermediate/csr/ocsp.example.com.csr.pem \
-out intermediate/certs/ocsp.example.com.cert.pem
验证生成的证书含有正确的x509 v3 extension:
# openssl x509 -noout -text \
-in intermediate/certs/ocsp.example.com.cert.pem
4.2、撤消证书,本次测试环境中使用openssl的ocsp工具作为ocsp responder,在生产环境需要商业版。
建立一个server的证书去测试
# cd /root/ca
# openssl genrsa -out intermediate/private/test.example.com.key.pem 2048
# openssl req -config intermediate/openssl.cnf \(又出现了,为什么生成server证书还要intermediate配置文件?没谷歌到)
-key intermediate/private/test.example.com.key.pem \
-new -sha256 -out intermediate/csr/test.example.com.csr.pem
# openssl ca -config intermediate/openssl.cnf \
-extensions server_cert -days 375 -notext -md sha256 \
-in intermediate/csr/test.example.com.csr.pem \
-out intermediate/certs/test.example.com.cert.pem
在本地运行OCSP responder,通常是和intermediate ca在一起(因为他使用他的配置文件呀),the OCSP responder reads index.txt directly,回复的消息也会使用OCSP cryptographic pair (using the -rkey and -rsigner options):
# openssl ocsp -port 127.0.0.1:2560 -text -sha256 \
-index intermediate/index.txt \
-CA intermediate/certs/ca-chain.cert.pem \
-rkey intermediate/private/ocsp.example.com.key.pem \
-rsigner intermediate/certs/ocsp.example.com.cert.pem \
-nrequest 1
在另一个窗口,向OCSP发送requery包,使用-cert指定证书来发送:
# openssl ocsp -CAfile intermediate/certs/ca-chain.cert.pem \
-url http://127.0.0.1:2560 -resp_text \
-issuer intermediate/certs/intermediate.cert.pem \
-cert intermediate/certs/test.example.com.cert.pem
------会有很多输出信息,OCSP Response Status表示发回来的状态,Responder Id是指responder的身份,Cert Status表示撤消状态。-------
撤消证书动作,谁签发谁撤消:
# openssl ca -config intermediate/openssl.cnf \
-revoke intermediate/certs/test.example.com.cert.pem
然后再请求一次,就可以看到撤消的状态了。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。