【教程】开启Nginx的SNI验证(单域名)

前言

我来简单地介绍一下,开启SNI验证有啥用  :cool:  :“在Nginx的默认SSL配置下,当客户端尝试建立TLS连接时发送的SNI不包含域名时,Nginx依旧会发送SSL/TLS证书给客户端,从而导致ip背后的域名信息泄露。此文主要介绍解决此问题的方法。”                        简而言之 :mrgreen:  ,就是能够防止别人通过抓包的方式,获取你的ip背后的域名信息(?)

注意事项

开启此功能后,如果你有使用CDN加速的必要,

必须开启CDN的SNI回源!

必须开启CDN的SNI回源!

必须开启CDN的SNI回源!

否则可能会导致各种5xx错误!

 

 

 

如上图,输入你配置的域名即可

安装准备

  • 系统:Linux
  • 一台能上网的电脑
  • 一个正常的大脑
  • 一双手
  • 键盘 :lol:

一、安装过程

1.检查nginx模块

在终端中输入sudo nginx -V,你可以看到你当前nginx支持的模块

其中安装sni验证必须具备以下三个模块:

--with-stream
--with-stream_ssl_module
--with-stream_ssl_preread_module

如果有这三个模块,你就可以跳过1、2步骤啦;反之,则需要跟紧步伐 :lol:

2.下载源码包

再次输入sudo nginx -V,会得到(类似)下列信息:

nginx version: nginx/1.14.1   #你的nginx版本,记着
built by gcc 8.3.1 20190507 (Red Hat 8.3.1-4) (GCC) 
built with OpenSSL 1.1.1d  10 Sep 2019 (running with OpenSSL 1.1.1c FIPS  28 May 2019)
TLS SNI support enabled
configure arguments:  #已安装的模块
--prefix=/usr/local/nginx 
--with-http_stub_status_module 
--with-http_ssl_module 
--with-http_v2_module 
--with-http_gzip_static_module 
--with-http_sub_module 
--with-stream 
--with-stream_ssl_preread_module 
--with-stream_ssl_module 
--with-cc-opt=-DTCP_FASTOPEN=23

注意!如果你不想升级nginx,则请将下面的命令中的1.14.1替换为你的Nginx版本!

在终端输入:

wget http://nginx.org/download/nginx-1.14.1.tar.gz|将1.14.1改为你的Nginx版本 :neutral:

下载可能会有点慢哈 :???: ,期间可以喝杯茶~ :oops:

3.编译源码

这是最关键的一步!能不能成功安装就看这一步了! :idea:

将下载下来的源码压缩包解压缩

tar -zxvf nginx-1.14.1.tar.gz |记得将1.14.1改为你的版本
cd nginx-1.14.1               |同上

运行

sudo ./configure --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_preread_module --with-stream_ssl_module

接着

sudo make
sudo make install

检查编译是否成功:

如果到最后提示make [1],就表明此次编译是成功的,反之,则是失败的

二、配置文件

每个人的nginx配置文件目录各有不同 :smile:  ,我的就是在/usr/local/nginx/conf :mrgreen:

进入配置文件所在目录,并编辑:

cd /usr/local/nginx/conf 
sudo vim nginx.conf |每个人的配置文件也不同,有些是vhost的配置文件

在nginx.conf最后一个括号后加上:

stream {
map $ssl_preread_server_name $name { #你不用管
    backend.example.com      web; #把backend.example.com 改成你的
    default                  block; #只要sni name 不正确就断开连接
	}

upstream web {
    server 127.0.0.1:444; #你不用管
	}

upstream block {
    server 127.0.0.1:80; #也不需要管
	}

server {
    listen      443 reuseport; 
    listen [::]:443 reuseport;
    proxy_pass  $name;
    ssl_preread on; #同上面
	}
##############################################################
server {
    listen 80 ;
    listen [::]:80 ;
    #server_name backend.example.com; #把backend.example.com 改成你的
    return 444;
}
#对于上面有server:80的童鞋,此段代码不需要添加,在你上面那段server{}加##上return 444就可以了
#
}

注意:开启了ssl的童鞋,需要将你原配置里监听的443端口改为444,不然启动会报错!

三、启动nginx

在终端中输入:

sudo nginx -t

如出现xxxxxxxx test is successful,则说明配置木有问题,反之则需要查错(发在评论区上可以让大家一起帮你查错 :cool:

最后,重启:

Ubuntu 18.04,centos7及以上:
systemctl restart nginx
以下的我就不知道了 :cry: :eek: 

然后你的网站就更安全啦 :wink:

参考文献

《【教程】开启Nginx的SNI验证(单域名)》上有2条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注