SSL握手中win xp和SNI的那點事

 

SSL握手中win xp和SNI的那點事前端

 

1、背景需求
server1-3使用不一樣的域名對外提供https服務,用nginx做爲前端負載均衡器並負責https集中解密工做(以用戶訪問的域名爲依據進行流量分配,一樣的也是以域名爲依據來判斷應該將哪張證書丟給用戶。即:SNI(Server Name Identification)功能),用戶爲WIN XP和WIN 7(都使用IE8瀏覽器)。nginx

1 [root@localhost ~]$ nginx -V
2 nginx version: nginx/1.14.2
3 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) 
4 built with OpenSSL 1.0.2k-fips  26 Jan 2017
5 TLS SNI support enabled        ===> 查看SNI狀態

 

 

2、工做原理
一、用戶(WIN XP、WIN 7)經過DNS解析獲知"a.test.com"、"b.test.com"、"c.test.com"三個域名對應的IP都爲"192.168.178.154"
二、用戶(WIN XP、WIN 7)與"192.168.178.154"進行SSL握手,獲取相應域名證書後再次向"192.168.178.154"發起真正的http(已加密)請求
三、"192.168.178.154"收到加密後的http請求後先進行解密,而後再根據相應的策略向後端服務器server1-3發起http請求(未加密)
四、後端服務器server1-3進行處理後將回應的包發送給nginx,nginx將該數據進行加密後再次封裝而後發送給用戶後端

 

 

3、出現的問題:
就在你們都以爲這個邏輯十分順暢的時候問題來了,咱們發現WIN XP用戶使用IE瀏覽器不能正常訪問,其餘系統都可以正常訪問瀏覽器

 

 

4、排障:
一、WIN XP訪問一樣域名的80端口是否正常? 結果:正常。 說明問題出在SSL握手上了
二、將WIN XP和WIN 7訪問443端口的流量進行抓包分析(能夠看到WIN7的SSL握手成功,而WINXP第一次使用TLSv1握手失敗,而後自動換用SSLv3進行握手,但依然失敗)服務器

 

三、爲何WIN7發hello的時候的nginx就會迴應hello,而WINXP發hello時nginx就會回Alert呢? 咱們來展開WIN7和WINXP的hello包來仔細看下。(能夠看到WIN7的hello包中攜帶了Extension:server_name字段,而且裏面包含了要訪問的域名信息。而反觀WINXP則沒有該字段)負載均衡

 

四、那WINXP換用其餘瀏覽器能不能解決這個問題呢?(換用搜狗瀏覽器試下,結果發現能夠訪問了。抓包發現搜狗瀏覽器在發送SSL的hello包時會攜帶Extension:server_name字段,而且還附帶了一大堆其餘參數)網站

 

 

5、總結:ui

WINXP在使用IE訪問https網站時,對方服務器不能使用SNI方式進行分流,否則會由於不能創建SSL握手而訪問失敗加密

 

 

附:解決方案spa

一、WINXP換用其餘瀏覽器(對於公網服務不現實)

二、服務端經過IP地址頒發證書(WINXP雖不攜帶訪問的域名信息,但它總有三層包頭吧!)(推薦)

三、服務端全站只用一張大通配證書,不管用戶訪問哪一個域名都將該證書丟給它(不推薦)

相關文章
相關標籤/搜索