给nginx添加双向证书认证

本文主要介绍如何使用给nginx服务添加客户端证书认证从而实现双向加密。

对于一般的https网站来说,实际上https所使用的证书是属于单向验证,即客户端单向验证服务器的安全性,而服务器端是没有对客户端的身份进行验证的。关于https的原理,可以查看这篇文章:《SSL/TLS、对称加密和非对称加密和TLSv1.3》

如果自己部署了一些安全性较高的网站不希望被其他人随意访问,就可以尝试部署https的双向认证,对客户端也添加证书认证。本文将会使用openssl自签证书来完成最简单的一个https双向认证。

1、openssl自签证书

在开始之前我们新建一个目录专门用来存放这次生成证书相关的全部文件。openssl生成自签证书的命令非常简单,总结如下:

1
2
3
4
5
openssl genrsa -out root.key 1024

openssl req -new -out root.csr -key root.key

openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650

接下来我们开始逐个命令进行讲解,首先我们需要生成一个root.key文件

root.key文件生成之后,我们就可以根据key文件来生成一个记录证书信息的csr文件用于申请证书。csr文件需要记录相关的证书申请人的地址和邮件等信息,最后还可以设置一个密码,当需要使用这个csr文件来申请证书的适合就需要输入这个密码,否则无法使用,如果不想设置的话直接回车即可跳过

生成了keycsr文件之后,我们就可以自己生成一个crt的证书文件,由于这里是测试,我们可以直接把时间设定为10年

到这一步,我们已经生成了一个完整的自签CA证书,其中包含了私钥key文件,证书信息csr文件和公钥crt文件。

2、生成p12证书

为了方便使用,我们需要把证书打包成p12格式的证书文件,然后在客户端的电脑上导入。同样的在生成p12文件的时候我们最好添加一个密码保护,这样就算证书泄露了也不会导致安全问题。

1
openssl pkcs12 -export -clcerts -in root.crt -inkey root.key -out root.p12

3、配置nginx

最后我们只需要在nginx中需要使用双向认证的部分添加以下配置然后重启即可生效

1
2
3
4
# 客户端公钥证书
ssl_client_certificate /path/to/root.crt;
# 开启客户端证书验证
ssl_verify_client on;

最后我们在windows或者mac上面导入p12文件之后,打开对应的网站就会有相应的提示了:

如果不进行证书验证,则服务器会返回400错误。

我们还可以使用curl来进行测试,如果不带上证书,会直接报400错误。

1
2
3
4
5
6
7
8
9
# curl https://ip.tinychen.com
<html>
<head><title>400 No required SSL certificate was sent</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>No required SSL certificate was sent</center>
<hr><center>nginx</center>
</body>
</html>

带上证书之后则访问正常

1
2
[root@tiny-cloud /home/certs]# curl --cert ./root.crt --key ./root.key https://ip.tinychen.com
hello world

如果想要查看curl的详细过程,我们可以加上-v参数来查看。