You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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证书来验证客户端提交的证书合法性,而非直接指定允许的客户端证书。

解决办法

  1. 修改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证书路径
    ...
}
  1. 重新加载Nginx配置使修改生效:
nginx -s reload
  1. 再次用curl测试:
    • 若客户端密钥设置了密码,curl会提示输入密码;若不想每次输入,可先去除密钥密码:
      openssl rsa -in client.key -out client_nopass.key
      
      使用无密码密钥测试:
      curl --cacert ca.crt --cert client.crt --key client_nopass.key https://mywebsite.com
      

额外检查点

  • 确认CA证书、客户端证书的文件权限正确,Nginx进程可读取(建议设置为644,所有者为root)。
  • 验证客户端证书是否由指定CA签署:
    openssl verify -CAfile ca.crt client.crt
    
    返回client.crt: OK则说明签署有效。

内容的提问来源于stack exchange,提问作者Michael Cab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:08:26