用nginx架设tls/sni服务(三)
本系列文章的最后一篇,使用wireshark对sni的握手过程进行简单分析。
这篇文章里面为了方便分析,不使用之前两篇文章里的nginx
设置,直接使用已经配置好nginx的一个docker容器:
这个容器对应的github项目在这里:
可以仔细看下项目里面的README文件,学习使用方法。
下面是部署结构图:
在这篇文章里我们实验访问一下容器提供的foo.io
和bar.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
上面的请求里面的选项的意义如下:
-k
是让curl信任「自签名」证书。-v
是verbose
模式,输出更详细的日志。--resolve
是手工解析域名。因为容器提供的两个域名是需要我们自己手工解析的,所以要用到。
以下是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
的工作机制有帮助。