Nginx环境网站配置支持https协议时遇到了一个问题,直接通过IP访问,会显示证书不匹配,但是通过对应的域名访问是正常的,怎么配置Nginx拒绝HTTPS无效请求呢?写个教程记录下如何设置Nginx拒绝HTTPS无效请求,同时也给有需要的同学提供一丢丢帮助。
Nginx拒绝HTTPS无效请求两种方式配置规则
先握手响应在返回444状态码拒绝连接
客户端发起HTTPS请求,Nginx会先与客户端完成加密通道的握手建立响应后断开Nginx返回发送一个 444 状态码给客户端
server {
listen 443 default_server;
server_name localhost;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_certificate /xmisp/server/nginx/conf/ssl/default.pem;
ssl_certificate_key /xmisp/server/nginx/conf/ssl/default.key;
return 444 "Domain name is missing ssl certificate";
}在浏览器中直接输入 IP 访问,浏览器地址栏可能会先显示“不安全”或证书不匹配,点击继续后才会显示拒绝

缺点:需要由Nginx先处理一次完整的HTTPS协议SSL握手,但没有进行实际的数据传输,暴露了服务器上其他默认的证书信息
Nginx不用返回444状态码,直接拒绝握手
直接拒绝握手链接,不会发送任何请求
注意:ssl_reject_handshake 指令在 Nginx 1.19.4 及以上版本才支持。如果你的 Nginx 版本较老,可能无法使用该指令
server {
listen 443 default_server;
server_name localhost;
ssl_protocols TLSv1.2 TLSv1.3;
# 不用返回 444 了,直接拒绝握手
ssl_reject_handshake on;
}客户端(如浏览器)直接报错,显示“连接已重置”、“连接被对端重置”或ERR_SSL_UNRECOGNIZED_NAME_ALERT

两种规则对比
| 特性 | 配置一 (return 444) | 配置二 (ssl_reject_handshake on) |
| SSL握手 | 完成握手,在返回拒绝 | 不握手 |
| 证书发送 | 发送默认证书(指定证书) | 不发送 |
| 客户端感知 | 先握手成功(提示证书错误)然后断开 | 直接连接重置/失败 |
| 资源消耗 | 需要CPU响应计算请求 | 极低响应计算请求 |
| 信息泄露 | 泄露域名和证书信息 | 不泄露证书信息 |
| 适用场景 | 需要兼容某些旧客户端,或希望明确告知无服务 | 安全隐蔽,防扫描,防信息泄露 |
总结
选择哪个方式看自己的需求,如果安全加固防止通过 IP 直接访问暴露你的证书信息(如防止证书被滥用或暴露域名),建议使用ssl_reject_handshake on 是更优的选择。

