第06课:用

第06课:用 OpenSSL 搭建 CA 认证中心的中级证书

为什么需要引入中级证书

既然根证书(Root CA)能用来签名证书请求,为什么还需要中级证书。根据上篇内容的阐述,原因如下:为了安全性着想,试想,如果一旦 CA 根证书的私钥被泄露,那所有的被签名的证书的信息都能解密了,并能够用这个被泄露的 CA 私钥去签署任何的 SSL 证书请求。所以根证书以及其私钥一般都是保存在一个网络完全隔离,USB 隔离的安全服务器里面。商业 CA 通用的解决方案是:通过根 CA 证书去签名一些自己的二级,三、四级 CA 证书,通过这些中级证书来签名别的组织或者公司发送过来的 SSL 证书请求,而这些知名 CA 中心的根证书的公钥一般都是预装到当前的一些浏览器,操作系统或者手机移动设备里面的,比如 Windows 操作系统、Mac 操作系统、Linux 操作系统等。

下面咱们可以打开一个看看,假设以百度的网站为例子,其就是 GlobalSign 的中级证书颁发给百度网站的 SSL 证书的,而 GlobalSign 的 Root CA-R1 证书一般都是预装在操作系统里面的。

enter image description here

如何生成中级 CA 证书

那么如何生成中级证书呢?

首先生成一个 intermediate 目录,然后使用下面的命令生成 5 个子文件夹:

mkdir certs crl csr newcerts private

enter image description here

并生成下面的新文件,并在文件 serial 和 crlnumber 中输入 1000:

enter image description here

把上节中用来生成 Root CA 的 openssl.cnf 文件复制到 c:\rootca\itermediate 目录下,并对此文件做一个小的改动,改动如下,其他的地方不用修改。

[ CA_default ]
dir             = ./intermediate
private_key     = $dir/private/intermediate.key.pem
certificate     = $dir/certs/intermediate.cert.pem
crl             = $dir/crl/intermediate.crl.pem
policy          = policy_loose

准备工作做完后,开始生成中级证书了。

生成中级证书的私钥

输入下面的命令并输入保护秘钥的密码:

genrsa -aes256 -out intermediate/private/intermediate.key.pem 4096

enter image description here

执行完后,在文件夹 c:\rootca\intermediate\private 目录下,将会生成一个 intermediate.key.pem 的私钥文件。

enter image description here

生成中级证书的请求

输入下面的命令生成一个中级 CA 证书的证书请求。

req -config intermediate/openssl.cnf -new -sha256  -key intermediate/private/intermediate.key.pem  -out intermediate/csr/intermediate.csr.pem

输入保护中级证书的私钥的密码,并输入相关的中级证书的描述信息,比如国家代码、省份、组织等信息,需要注意的是,其下面的这个三个配置需要严格和 Root CA 一致,否则虽然能生成证书请求,但是后面被 Root CA 签名的时候会失败,切记,切记!

•    countryName             = match
•    stateOrProvinceName     = match
•    organizationName        = match

enter image description here

其会在 c:\rootca\intermediate\csr 目录下面生成类似于下面的一个证书请求。

enter image description here

使用根证书(Root CA)签名中级证书的请求

在使用根证书签名中级证书的请求前,请先确保下的文件在 c:\rootCA 文件夹下已经存在。

enter image description here

现在可以开始执行命令签名证书了,输入下面的命令,并输入保护 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

其会问你是否要签名证书请求,直接输入 y 即可。

enter image description here

将会在 c:\rootca\intermediate\certs 文件夹,生成一个 intermediate.cert.pem 的中级证书:

enter image description here

把 intermediate.cert.pem 改成 intermediate.cert.cer,打开其证书,我们看到中级证书被根证书签名并颁发成功。

enter image description here

也可以通过下面的命令,验证生成的中级 CA 证书。

x509 -noout -text  -in intermediate/certs/intermediate.cert.pem

通过下面的命令,可以验证中级证书的证书链是否正确。

verify -CAfile certs/ca.cert.pem intermediate/certs/intermediate.cert.pem

enter image description here

恭喜你,中级证书已经生成成功了!!!

导出 CA 的根证书和中级证书到一个 pem 文件中

退出上面的 OpenSSL 的命令窗体,直接在 cmd 的命令窗体中输入:

copy intermediate\certs\intermediate.cert.pem /a + certs\ca.cert.pem /a intermediate\certs\ca-chain.cert.pem

输入上面的命令,生成一个包括 Root CA 和中级 CA 的证书链 ca-chain.cert.pem:

enter image description here

使用根 CA 和中级 CA 来签名一下证书请求

养兵千日用兵一时,到目前为止,我们的认证中心的 CA 根证书和 CA 的中级证书都已经生成完毕了。下面是真正用我们的根 CA 和中级 CA 来签名一下证书请求的时候了。

生成证书请求私钥

下面生成一个证书请求,然后发给 RootCA 或者中级证书来签名。

genrsa -aes256 -out intermediate/private/www.example.com.key.pem 2048

需要注意的是,为了提高 SSL 通信的效率,现在一般的网站的私钥的长度在 2048 已经足够,同时为了生成一个没有密码保护的秘钥,只需要把 -aes256 参数去掉。因为现在一些 Web 服务器,比如 Tomcat 或者 Ngnix 都需要配置人提供一个不加密的私钥。

需要注意的是,在实际的把证书请求发给第三方 CA 签名的时候,我们不需要把这个私钥发给第三方的 CA,而且还要好好保存好这个证书请求的私钥。

生成证书请求

通过下面的命令,创建一个证书请求:

req -config intermediate/openssl.cnf -key intermediate/private/www.example.com.key.pem  -new -sha256 -out intermediate/csr/www.example.com.csr.pem

enter image description here

签署证书请求

通过下面的命令签署证书请求。

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

enter image description here

生成后,把 www.example.com.cert.pem 改名成 www.example.com.cert.cer,并在 Windows 操作系统上打开,就能看到其完整的证书链(注意:如果想看到下面的证书链,请确保已经把根证书和中级证书导入了操作系统里面,否则将看不到下面的完整的证书链)。

enter image description here

还可以通过下面的命令进行验证,我们可以看到,其被中级证书签名成功。

verify -CAfile intermediate/certs/ca-chain.cert.pem intermediate/certs/www.example.com.cert.pem

enter image description here

另外可以使用下面的命令,把服务器证书的公钥和私钥导出。

pkcs12 -export -inkey private/sch3-sa01-dsc01.key  -in result.pem -name my_name -out final_result.pfx

总结

这篇文章主要和读者一起分享了创建中级 CA 证书的原因,如何创建中级 CA 证书,最后,用一个实际的例子,演示了如何用生成的中级 CA 证书签名一个 SSL 证书请求并颁发一个新的 SSL 证书,由于水平有限,如果有疏漏之处还请不吝赐教,最后祝大家学习愉快。

上一篇
下一篇
目录