Nginx配置Let's Encrypt证书+mTLS客户端认证遇400错误求助
Nginx客户端证书认证400错误排查与解决
问题背景
使用Nginx作为Web服务器,服务器证书由Let's Encrypt生成,已通过OpenSSL创建自签CA、客户端证书并完成签署,操作步骤如下:
# 创建CA密钥和证书,用于签署客户端证书 openssl genrsa -des3 -out ca.key 4096 openssl req -new -x509 -days 365 -key ca.key -out ca.crt # 创建客户端密钥和CSR openssl genrsa -des3 -out client.key 4096 openssl req -new -key client.key -out client.csr # 用CA证书签署客户端证书 openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
已将ca.crt和client.crt添加到Linux系统信任库(/etc/ssl/certs或/usr/local/share/ca-certificates)。
执行curl命令访问时返回400错误:
curl --cacert ca.crt --cert client.crt --key client.key https://mywebsite.com
错误提示:
No required SSL certificate was sent
当前Nginx配置(mywebsite.conf)关键片段:
server { listen 443; server_name mywebsite.com; index index.html; ... ssl_verify_client on; ssl_client_certificate /path/to/client.crt; ... }
错误原因
核心问题出在Nginx配置:ssl_client_certificate参数指定的应该是CA证书(ca.crt),而非客户端证书(client.crt)。该参数的作用是告知Nginx用哪个CA证书来验证客户端提交的证书合法性,而非直接指定允许的客户端证书。
解决办法
- 修改Nginx配置文件
mywebsite.conf,将ssl_client_certificate的值改为CA证书的路径:
server { listen 443; server_name mywebsite.com; index index.html; ... ssl_verify_client on; ssl_client_certificate /path/to/ca.crt; # 修改为CA证书路径 ... }
- 重新加载Nginx配置使修改生效:
nginx -s reload
- 再次用curl测试:
- 若客户端密钥设置了密码,curl会提示输入密码;若不想每次输入,可先去除密钥密码:
使用无密码密钥测试:openssl rsa -in client.key -out client_nopass.keycurl --cacert ca.crt --cert client.crt --key client_nopass.key https://mywebsite.com
- 若客户端密钥设置了密码,curl会提示输入密码;若不想每次输入,可先去除密钥密码:
额外检查点
- 确认CA证书、客户端证书的文件权限正确,Nginx进程可读取(建议设置为
644,所有者为root)。 - 验证客户端证书是否由指定CA签署:
返回openssl verify -CAfile ca.crt client.crtclient.crt: OK则说明签署有效。
内容的提问来源于stack exchange,提问作者Michael Cab
相关产品推荐
相关产品推荐

