如何配置Nginx拒绝HTTPS协议无效请求

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 访问,浏览器地址栏可能会先显示“不安全”或证书不匹配,点击继续后才会显示拒绝

image.png

缺点:需要由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

image.png

两种规则对比

特性配置一 (return 444)配置二 (ssl_reject_handshake on)
SSL握手完成握手,在返回拒绝不握手
证书发送发送默认证书(指定证书)不发送
客户端感知先握手成功(提示证书错误)然后断开直接连接重置/失败
资源消耗需要CPU响应计算请求极低响应计算请求
信息泄露泄露域名和证书信息不泄露证书信息
适用场景需要兼容某些旧客户端,或希望明确告知无服务安全隐蔽,防扫描,防信息泄露

总结

选择哪个方式看自己的需求,如果安全加固防止通过 IP 直接访问暴露你的证书信息(如防止证书被滥用或暴露域名),建议使用ssl_reject_handshake on 是更优的选择。


© 除非注明,否则均为阿豪运维笔记原创文章,转载或复制请以超链接形式并注明出处

取消
微信二维码
微信二维码
支付宝二维码