ssl_client_certificate /etc/nginx/cert/client-ca.crt;
ssl_verify_client on;
# 只对指定路径开启
location /api/ { ssl_verify_client on; }

接口加了 ssl_verify_client on,浏览器访问返回 400 No required SSL certificate was sent,App 端也连不上。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,双向认证要求客户端在握手时出示证书,浏览器默认没有,服务端直接拒绝。这个开关一开,所有没装证书的访问都会失败。

「双向认证 400」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

处理上按这个顺序:先确认业务是否真的需要双向认证,只保护特定路径就别在全局开;需要时把 CA 证书配到 ssl_client_certificate,客户端证书由这个 CA 签;给客户端分发证书并说明安装步骤,验证失败时返回可读的提示页。

改完只确认一件事:装了客户端证书的设备能正常访问,没装的返回 400 且日志有记录。

作者 9823189