用nginx架设tls/sni服务(三)

本系列文章的最后一篇,使用wireshark对sni的握手过程进行简单分析。

这篇文章里面为了方便分析,不使用之前两篇文章里的nginx设置,直接使用已经配置好nginx的一个docker容器:

这个容器对应的github项目在这里:

可以仔细看下项目里面的README文件,学习使用方法。

下面是部署结构图:

在这篇文章里我们实验访问一下容器提供的foo.iobar.io这两个virtual hosts。

把项目clone下来以后,先启动容器:

$ docker-compse pull
$ docker-compse up

以下是启动过程:

容器启动以后,我们把wireshark也启动,并设置捕获localhost的数据包:

开始捕获以后,填写filter捕获tls协议相关的数据包:

wireshark这边设置好以后,可以使用curl来访问容器的服务了:

$ curl -k -v --resolve foo.io:443:127.0.0.1 https://foo.io

上面的请求里面的选项的意义如下:

以下是curl这边的访问过程:

访问完成后,看wireshark这边,可以看到在Client Hello这个最初阶段的Server Name Indication数据传递情况:

可以看到客户端给出了要访问的域名,所以服务器也就可以给出域名对应的证书。

此时我们再访问bar.io这个域名试试看:

$ curl -k -v --resolve bar.io:443:127.0.0.1 https://bar.io

以下是访问过程和结果:

此时查看wireshark这边:

可以看到curl通过sni给服务器提供了要访问的域名为bar.io,所以服务端就可以给出对应的证书和使用对应的virtual host来提供服务了。

至此,这个系列的文章要介绍的内容就完成了。希望对大家学习SNI的工作机制有帮助。

Powered by Jekyll and Theme by solid