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

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回源请求访问源站:

  1. 将全局的ssl_verify_client on;修改为ssl_verify_client optional;,新增ssl_verify_depth 2;配置,避免全局强制拦截导致合法请求被挡。
  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;
    }
}
  1. 登录Cloudflare控制台,在源站配置中开启源站客户端证书认证,上传对应客户端证书,确保Cloudflare回源时自动携带有效证书。
  2. 执行nginx -t验证配置通过后,执行systemctl reload nginx重载配置即可。

方案2:简化配置,用IP白名单+源站认证替代客户端证书校验

如果不想维护客户端证书配置,可以关闭客户端证书校验,通过两层规则保障源站安全,配置更简单不易出错:

  1. 删除原配置中ssl_client_certificate、ssl_verify_client两行相关配置。
  2. 配置Nginx规则,仅允许Cloudflare官方回源IP段访问80、443端口,其余来源IP直接返回403。
  3. 在Cloudflare控制台开启经过身份验证的源站拉取功能,同时在源站服务器防火墙(安全组/ufw/iptables)中配置规则,仅放行Cloudflare回源IP段的80、443端口访问,禁止其余公网IP直连源站。

注意:无论使用哪种方案,都要将Cloudflare的SSL/TLS加密模式设置为「完全(严格)」,禁止使用灵活模式,避免回源链路未加密触发安全告警。

内容的提问来源于stack exchange,提问作者Richard Römer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 05:24:52