在 Nginx 中开启客户端证书验证
2024-10-31 04:28:12 # 技术

在折腾个人服务器时,会有一些服务不面向公众,只供自己使用。比如常见的管理面板:宝塔、1Panel、Portainer,这些服务一般只供自己使用,并且需要特别关注安全性。常用的安全措施是使用 2FA、限制 ip 访问。但是 2FA 受限于服务商支持情况,限制 ip 便捷性较差。

客户端证书服务端证书原理相同,都是采用非对称加密方式。公钥加密,私钥解密。

服务端证书是客户端使用公钥加密,服务端使用私钥解密。除了服务端,第三方无法解密,这样可以防止第三人攻击。
客户端证书与之相反,服务端使用公钥加密,客户端使用私钥解密。这样只有拥有私钥证书的客户端才能与服务器通信。

要在 Nginx 中开启客户端证书验证(即双向 SSL/TLS 认证),需要以下几个步骤:

1. 生成 CA 证书

首先需要有一个自签名的 CA 证书,用于签署客户端证书。

生成 CA 私钥:

openssl genrsa -out ca.key 4096

生成自签名 CA 证书:

openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt

这里会要求输入一些信息,如国家代码、组织名称等。生成的 ca.crt 将作为客户端证书的验证依据。

2. 生成客户端证书

生成客户端私钥:

openssl genrsa -out client.key 2048

生成证书请求(CSR):

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

使用 CA 证书签署客户端证书:

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

这里 3650 为证书过期时限,即 3650 天,10 年。
现在你有了 client.crtclient.key,这是客户端需要的证书。

3. 配置 Nginx 启用客户端证书验证

配置 Nginx 服务器块

在 Nginx 配置文件中添加或修改 server 块,启用 SSL 并启用客户端证书验证:

server {
listen 443 ssl;
server_name example.com;

# 服务器证书和私钥
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/server.key;

# CA证书,用于验证客户端证书
ssl_client_certificate /path/to/ca.crt;

# 要求客户端必须提供证书
ssl_verify_client on;

# SSL协议及加密套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;

location / {
try_files $uri $uri/ =404;
}
}
  • ssl_client_certificate: 指定 CA 证书路径,Nginx 会根据该证书验证客户端证书是否可信。
  • ssl_verify_client on: 强制要求客户端提供证书。如果设置为 optional,则客户端可以选择不提供证书。

4. 测试客户端证书验证

使用带有客户端证书的请求测试 Nginx 配置。例如,可以使用 curl 命令行工具:

curl -v --key client.key --cert client.crt --cacert ca.crt https://example.com

如果客户端证书验证成功,Nginx 会允许请求通过;否则,连接将会被拒绝。

5. 生成 p12 证书

为方便在客户端导入证书,需要将其转换为 Windows/Android 可识别的证书。

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

通过这种方式,可以为网站启用客户端证书验证,加强安全性。

上一页
2024-10-31 04:28:12 # 技术