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证书」签名过的,并且在访问「服务端」的时候使用了「客户端证书」,那么就认为这个「客户端」是被信任的。

所以说,在双向认证的场景下,不光是「客户端」验证「服务端」的证书,反过来「服务端」也验证「客户端」的证书。

「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证书」和「客户端证书」的创建过程,在下一篇文章里,讲解证书的签名过程。

Powered by Jekyll and Theme by solid