为啥我Nginx证书配的没问题,但客户端却发现证书不匹配?
问大家一个问题
我们都知道HTTPS协议是安全的协议,用户的请求数据都是加密传输。而在我们实际生产环境中,一般是多个域名公用一个IP或IP组,后端的nginx服务器也是一组集群,nginx上配置的证书是多个,那当客户端进行TLS握手的时候,nginx如何知道改用哪张证书进行握手呢?
让我们一步一步来看
浏览器中访问的网站地址是不是加密过的呢?
了解过HTTPS协议的同学应该都知道,HTTPS就是HTTP运行在TLS协议之上,客户端和服务端进行TLS握手之后,双方通过交换的会话秘钥再进行加密后的HTTP请求
懒得画图,截个curl的请求过程凑合看一下
下面是curl 发起访问 https://www.baidu.com/ 的请求过程
很明显域名和请求路径等信息是在TLS握手之后的加密数据中,在TLS握手的时候是无法获取的
那 Nginx 是如何知道该用拿张证书进行握手呢?
一般是通过SNI来匹配证书
SNI(Server Name Indication)是TLS协议的一个扩展功能,用于在握手阶段向服务器表明客户端想要连接的具体域名。
wireshark 抓下包长这样
还有一种情况是,如果没有SNI,就使用Nginx的默认 server 来进行握手
如果遇到证书不匹配的问题,但是Nginx配置好像没问题,可以找这个角度排查一下,不过这种异常我遇见的很少,一般是手写HTTPS客户端或者用的一些老库可能有这种问题~~