Nginx报400 Bad Request:未发送所需SSL证书如何解决
故障根因
你配置中全局开启的ssl_verify_client on;会强制要求所有发起HTTPS连接的客户端必须提供受信任的SSL客户端证书,未携带有效证书的请求会被Nginx直接返回400错误。
你配置该规则的本意是拦截非Cloudflare的直连源站请求,但当前配置逻辑存在明显偏差:普通终端用户通过浏览器访问时不会主动携带匹配的客户端证书,若未在Cloudflare侧配置回源客户端证书,Cloudflare回源请求也不会携带对应证书,两类请求都会触发400报错。当你关闭ssl_verify_client配置后,所有请求不再被校验证书,自然可以正常访问,但此时源站完全暴露在公网,会触发未授权访问的安全告警。
定位排查步骤
- 校验配置与文件有效性:先执行
nginx -t确认Nginx配置无语法错误,再检查/etc/ssl/cloudflare.crt文件权限,确保Nginx运行用户(通常为www-data或nginx)对该文件有读权限,同时确认该文件为最新的Cloudflare源站信任CA证书,未出现内容损坏、过期问题。 - 确认Cloudflare加密模式:登录Cloudflare控制台查看对应站点的SSL/TLS加密模式,若为「灵活」模式,Cloudflare不会与源站建立HTTPS回源连接,必然触发证书校验失败。
- 校验请求来源:临时开启Nginx错误日志的debug级别,复现400报错时查看请求来源IP,确认是Cloudflare回源未携带证书,还是公网用户直连源站IP触发的拦截。
修复方案
根据你的安全需求二选一即可:
方案1:保留客户端证书校验逻辑(适配现有配置)
该方案通过客户端证书+IP白名单双重校验,仅允许携带有效证书的Cloudflare回源请求访问源站:
- 将全局的
ssl_verify_client on;修改为ssl_verify_client optional;,新增ssl_verify_depth 2;配置,避免全局强制拦截导致合法请求被挡。 - 在Nginx配置中新增Cloudflare回源IP段匹配规则,对非Cloudflare来源IP、未通过客户端证书校验的请求直接返回403,参考配置如下:
# http块中定义Cloudflare回源IP匹配规则,需自行补充全量Cloudflare官方最新回源IP段 geo $is_cloudflare { default 0; 173.245.48.0/20 1; 103.21.244.0/22 1; } server { listen 443 ssl http2; listen [::]:443 ssl http2; ssl_certificate /etc/ssl/cert.pem; ssl_certificate_key /etc/ssl/key.pem; ssl_client_certificate /etc/ssl/cloudflare.crt; ssl_verify_client optional; ssl_verify_depth 2; server_name example.com www.example.com; # 拦截非法请求 if ($is_cloudflare != 1) { return 403; } if ($ssl_client_verify != SUCCESS) { return 403; } location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/username/www/exampleproject; } location /media/ { root /home/username/www/exampleproject; } location / { include proxy_params; proxy_pass http://unix:/home/username/www/exampleproject/exampleproject.sock; } }
- 登录Cloudflare控制台,在源站配置中开启源站客户端证书认证,上传对应客户端证书,确保Cloudflare回源时自动携带有效证书。
- 执行
nginx -t验证配置通过后,执行systemctl reload nginx重载配置即可。
方案2:简化配置,用IP白名单+源站认证替代客户端证书校验
如果不想维护客户端证书配置,可以关闭客户端证书校验,通过两层规则保障源站安全,配置更简单不易出错:
- 删除原配置中
ssl_client_certificate、ssl_verify_client两行相关配置。 - 配置Nginx规则,仅允许Cloudflare官方回源IP段访问80、443端口,其余来源IP直接返回403。
- 在Cloudflare控制台开启经过身份验证的源站拉取功能,同时在源站服务器防火墙(安全组/ufw/iptables)中配置规则,仅放行Cloudflare回源IP段的80、443端口访问,禁止其余公网IP直连源站。
注意:无论使用哪种方案,都要将Cloudflare的SSL/TLS加密模式设置为「完全(严格)」,禁止使用灵活模式,避免回源链路未加密触发安全告警。
内容的提问来源于stack exchange,提问作者Richard Römer
相关产品推荐
相关产品推荐

