You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Nginx开启ssl_verify_client on后未拦截无客户端证书请求的问题咨询

Nginx开启ssl_verify_client on后未拦截无客户端证书请求的问题咨询

嘿,我看你遇到的这个问题确实挺闹心的——明明配置了ssl_verify_client on,结果没带客户端证书的请求居然还能正常返回200,完全没按预期被拦截。我帮你捋捋配置里的关键问题:

你把ssl_client_certificate这行给注释掉了!这可是客户端证书验证的核心配置之一啊。Nginx需要通过这行指定信任的客户端证书CA证书包,它得知道哪些CA签发的客户端证书是合法的,不然根本没法完成完整的证书验证流程,相当于你开了验证开关,但没给它验证的依据,自然就没法拦截无证书的请求了。

当你开启ssl_verify_client on时,Nginx会要求客户端提供证书,但如果没有配置ssl_client_certificate,Nginx没有信任的CA列表,它就会跳过验证逻辑,直接放行请求,这就是为什么浏览器不带证书还能正常访问的原因。

给你修正后的配置参考:

server {
  listen 443 default_server ssl;
  server_name _;

  # bundle = my cert + CA cert
  ssl_certificate /etc/ssl/example.com.bundle.pem;
  ssl_certificate_key /etc/ssl/example.com.key;

  # 取消注释这行,指定信任的客户端证书CA bundle
  ssl_client_certificate /etc/ssl/client/client-bundle.pem;
  
  ssl_verify_client on;
  ssl_verify_depth 2;
  ssl_protocols TLSv1.2;
}

另外再给你提几个小细节:

  • 确保client-bundle.pem里包含了客户端证书的整个信任链(如果是多级CA签发的,要把所有上级CA证书都加进去),你配置的ssl_verify_depth 2已经能覆盖两级深度的验证,这个是没问题的。
  • 配置修改后一定要重启或者重载Nginx(执行nginx -s reload),不然新配置不会生效。
  • 测试的时候可以用curl工具快速验证:
    • 模拟无证书请求:curl -v https://api.example.com/foo/bar,正常应该返回403 Forbidden
    • 模拟带合法证书的请求:curl -v --cert /path/to/your-client-cert.pem --key /path/to/your-client-key.pem https://api.example.com/foo/bar,应该能正常访问

备注:内容来源于stack exchange,提问作者JK01

火山引擎 最新活动