Nginx支持SNI转发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx支持SNI转发相关的知识,希望对你有一定的参考价值。

参考技术A SNI是一个TLS的扩展字段,经常用于访问域名跳转到不同的后端地址。

配置方式如下:打开nginx.conf文件,以ttbb/nginx:nake镜像为例/usr/local/openresty/nginx/conf/nginx.conf

如下为默认的nginx.conf配置

在最后面添加上

这个时候,我们已经开启了SNI转发的功能,如果你使用backend.example.com的域名访问服务器,就会转发到backend,如果使用其他域名,就会转发到backend2

测试的时候,让我们在/etc/hosts里进行设置,添加

然后进行请求

这里注意请求要使用https,http协议或者是tcp可没有SNI的说法

发现请求的确实是backend

然后测试请求127.0.0.1

关于Nginx根据SNI字段匹配对应证书加密套件支持

背景原因:
SSL层其实位于TCP/IP协议层中,应用层和运输层之间,尚未到达HTTP这一层,但是又位于TCP之上。 我们知道,Nginx支持在一个IP上服务多个域名,原因就在于,HTTP协议里有一个字段是 Host,通过匹配这个字段的值和 nginx.conf 中各server段的 server_name,Nginx就可以方便的把请求转发到对应的内容服务器上去。

但是对于HTTPS却行不通,为什么呢?上面说过,SSL位于HTTP协议和TCP协议之间,也就是说,一个请求到来, 在握手阶段,SSL并不知道这个请求到底是请求哪个Host。而要知道Host,就需要解密HTTP请求,但是SSL这一层正是为了加密HTTP的。于是就陷入了一种先有鸡还是先有蛋的问题。

所以有了SNI字段:Server Name Indication,工作原理是在SSL握手的阶段,浏览器通过SNI扩展字段把域名信息一起发过去。这样 Nginx便可以在一个IP上服务多个HTTPS服务。但是这个技术有三个要求:

1、Nginx编译时需要允许这个设定,可以通过 nginx -V查看
技术图片

2、Nginx动态链接的openssl要支持这个功能,也可以通过 nginx -V看,如果没有异常信息,就是支持的,此外openssl从 0.9.8f开始支持这个功能
3、用户所使用的浏览器支持这个功能

实测结果:
在Nginx上配置了不同的域名及对应证书,测试域名为 www.huawei.com 与 www.syjhahaha.com。

1、如果是通过curl -vk -H "Host:www.syjhahaha.com" "https://10.93.167.110:443/test"发起https请求,则由于没有SNI扩展字段信息,则Nginx会使用第一个server段(www.huawei.com)来匹配,使用的是该server段的证书和加密套件支持等信息
2、实测,如果是通过浏览器(例如chrome)来发起请求,则可以根据SNI字段域名信息,精确匹配到具体的server。也就是说,域名为www.syjhahaha.com的请求,可以匹配到对应的server段(www.syjhahaha.com)上,使用的是对应的证书和加密套件信息。

以上是关于Nginx支持SNI转发的主要内容,如果未能解决你的问题,请参考以下文章

关于Nginx根据SNI字段匹配对应证书加密套件支持

nginx端口转发&负载均衡

使用Nginx转发TCP/UDP数据

利用Nginx做端口转发

nginx 配置转发ws协议

nginx 的多域名多https转发设置方法