HTTPS的双向认证(三)
这篇文章接着前一篇,继续讲解「CA证书」和「客户端证书」的创建过程。
创建CA证书
接下来创建一张「CA证书」。「CA证书」也是一张自签名证书,所以创建过程和前一篇文章介绍的「服务端证书」的过程是一样的。
下面是创建CA证书的命令:
$ openssl req \
-new \
-newkey rsa:4096 \
-days 365 \
-nodes \
-x509 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=Personal/CN=ca" \
-keyout ca.key \
-out ca.crt
以下是命令的执行过程:
如上所示,我们通过openssl
命令创建了一张ca.crt
证书,并且生成了对应的私钥文件ca.crt
。此外这张证书的CN
值为ca
。
这张证书后续的作用有两个:
- 给「客户端证书」签名。
- 作为「CA证书」配置进
nginx
,用于验证「客户端证书」的有效性。
这样,所有的客户端,如果它使用的证书,是这张「CA证书」签名过的,并且在访问「服务端」的时候使用了「客户端证书」,那么就认为这个「客户端」是被信任的。
所以说,在双向认证的场景下,不光是「客户端」验证「服务端」的证书,反过来「服务端」也验证「客户端」的证书。
「CA证书」生成完成后,接下来是生成「客户端证书」。
创建客户端证书
最后需要创建的是「客户端证书」。创建客户端证书的命令如下:
$ openssl genrsa -out client.key 4096
$ openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Personal/CN=client"
如上所示,我们先生成私钥,然后使用私钥生成一个待签名证书client.csr
。以下是命令的执行过程:
从上面的命令中,有一处和生成之前的两张证书不同,就是生成的证书文件的扩展名这次命名为.csr
,而不是.crt
。
csr
的含义就是Certificate Signing request
,就是代表这张证书准备拿去第三方权威机构签名,用来和最后签过名的证书做区分。证书里面的格式和之前生成的两张证书没有区别。以下是客户端证书的内容:
可以看到都是标准的格式。可以使用openssl
查看这张证书的内容:
$ openssl req -text -noout -in client.csr | head
可以看到这张客户端证书和之前生成的两张证书不同之处在于,这张证书目前没有Issuer
:
也就是说这张证书还没有被签名(也没有自签名),所以后续我们要用「CA证书」给这张证书签名。
本文讲解了「CA证书」和「客户端证书」的创建过程,在下一篇文章里,讲解证书的签名过程。
- 上一篇 HTTPS的双向认证(二)
- 下一篇 HTTPS的双向认证(四)