HTTPS的双向认证(四)

这一篇接着上一篇的内容,继续讲解客户端证书的签名过程。

在前两篇文章里,我们按照架构的设计生成了三张证书,分别是「服务端证书」,「CA证书」,「客户端证书」。

这一篇文章里,我们来使用「CA证书」给「客户端证书」进行签名。首先看一下目前为止生成的证书文件:

可以看见一共是三张证书文件,和它们对应的私钥文件。注意在实际的部署环境中,这三套东西应该是分别放在不同的地方的。

其中「服务端证书」和「CA证书」是应该放在服务器这边,因为这两张证书后续都要配置进nginx服务器。

特别是要注意这两张证书的密钥非常重要,因为一旦密钥泄露,那么等于「服务端」的身份就泄露了,并且所有由「CA证书」签名的「客户端证书」的身份也都泄露了。

然后「客户端证书」和密钥文件是要放在「客户端」,但是这个证书会提交给服务端,用「服务端」的「CA证书」来签名。签名后的「客户端证书」再返给「客户端」。这样,「客户端」发起请求的时候,带上这张签过名的证书发请求给「服务端」,「服务端」的nginx服务因为配置了「CA证书」,所以由「CA证书」签名过的「客户端证书」都是被信任的,因此这样的客户端请求就允许访问。

讲解完原理,接下来就用「CA证书」给「客户端证书」进行签名,签名过程使用openssl

$ openssl x509 -req -days 360 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt

以下是命令的执行过程:

可以看到「CA证书」通过自己的「私钥文件」给「客户端证书」完成了签名。转化成具体的命令,就是ca.crtclient.csr完成了签名,这个过程中使用到了ca.key。这也是为什么ca.key一定要妥善保存,否则有了私钥,就可以用对应的证书给其它证书签名了。

完成签名后,就从client.csr这个未签名的证书得到了已经由「CA」签名的client.crt。可以使用下面的openssl命令查看已经签名完的client.crt的内容:

$ openssl x509 -noout -text -in client.crt | head -n 20

此时可以看到最终的client.crt里面SubjectCNclient,而IssuerCNca。也就是说这张「客户端证书」已经被「CA证书」签名了。

关于证书签名,本文就介绍到这里,下一篇文章讲解如何配置nginx服务和curl端如何使用证书完成「ssl双向认证」。

My Github Page: https://github.com/liweinan

Powered by Jekyll and Theme by solid

If you have any question want to ask or find bugs regarding with my blog posts, please report it here:
https://github.com/liweinan/liweinan.github.io/issues