Nginx 应通过 ssl_reject_handshake(≥1.19.4)或哑证书+444(旧版)阻止未匹配域名的HTTPS请求,避免暴露真实业务域名;需配合精确 server_name 和 Host 校验,并实测验证证书不泄露。

直接用源 IP 访问 Nginx 的 443 端口,即使未完成 TLS 握手,也会触发证书交换过程。攻击者或扫描器只需发起一次 TCP 连接并读取服务端返回的证书,就能获取证书中 Subject、SAN 或 issuer 字段所包含的真实业务域名——这相当于主动向外界“自报家门”,极易被用于网关指纹识别、资产测绘和恶意域名解析。防范核心不是阻止连接,而是让非预期访问在 TLS 层就终止,不暴露任何有效证书信息。
强制拒绝未匹配域名的 HTTPS 请求(Nginx ≥1.19.4)
新版 Nginx 提供原生支持,无需证书即可阻断非法握手:
- 在任意 server 块外或独立配置文件中添加:
listen 443 ssl default_server;
ssl_reject_handshake on;
}
- 该配置会让所有未命中任一 server_name 的 HTTPS 请求,在 TLS ServerHello 阶段直接关闭连接,不发送证书;
- 客户端收到的是 TCP RST 或空响应,无法提取任何域名线索;
- 必须确保其他合法站点的 server 块显式声明 listen 443 ssl 且含有效 server_name,否则它们也会被拦截。
兼容旧版本:用自签名哑证书 + 444 响应
对于低于 1.19.4 的 Nginx,需提供占位证书以通过配置校验,但证书本身不可泄露业务信息:
- 生成仅含 IP 地址(不含域名)的自签名证书,CN 和 SAN 全部留空或设为虚构值(如 ip-only.example),确保浏览器提示“证书不匹配”而非显示真实业务域名;
- 配置如下:
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/ssl/ip-only.crt;
ssl_certificate_key /etc/nginx/ssl/ip-only.key;
return 444;
}
- return 444 在 TLS 握手完成后立即断开 HTTP 层连接,避免日志记录或响应体泄露;
- 务必确认该 server 块是 443 端口的 default_server,否则请求可能落入其他业务块而意外暴露。
配合 Host 头校验增强防护
在已有业务 server 块中补充严格 Host 匹配,形成双重保险:
- 对所有启用 SSL 的业务站点,禁用通配符或模糊匹配,使用精确 server_name,例如:server_name api.example.com; 而非 *.example.com;
- 可增加运行时校验(适用于无法升级或需细粒度控制场景):
return 444;
}
- 该判断在 SSL 握手完成后执行,虽略晚于证书发送,但能拦截已建立连接的非法 Host 请求,防止被用于代理探测或 SNI 绕过尝试;
- 注意:此方式不能替代 ssl_reject_handshake 或哑证书,仅作补充。
验证是否生效
部署后必须外部实测,不可仅依赖本地 curl:
- 用 OpenSSL 手动发起 TLS 握手:openssl s_client -connect YOUR_IP:443 -servername fake.example.com,观察返回的证书 CN/SAN 是否为空或无关;
- 用浏览器访问 https://YOUR_IP,应显示连接重置、空白页或证书警告(且警告中不出现你的真实业务域名);
- 检查 Nginx error log,确认无因证书缺失导致的启动失败,也无大量 444 日志暴露出错配置。


















