关于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)上,使用的是对应的证书和加密套件信息。

猜你喜欢

转载自www.cnblogs.com/linyihan/p/11234055.html
SNI
今日推荐