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.crt
给client.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
里面Subject
的CN
是client
,而Issuer
的CN
是ca
。也就是说这张「客户端证书」已经被「CA证书」签名了。
关于证书签名,本文就介绍到这里,下一篇文章讲解如何配置nginx
服务和curl
端如何使用证书完成「ssl双向认证」。
- 上一篇 HTTPS的双向认证(三)
- 下一篇 使用sdkman安装GraalVM