1. 程式人生 > >SSL握手中win xp和SNI的那點事

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

 

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

 

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

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狀態

 

 

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

 

 

三、出現的問題:
就在大家都覺得這個邏輯十分順暢的時候問題來了,我們發現WIN XP使用者使用IE瀏覽器不能正常訪問,其他系統均可以正常訪問

 

 

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

 

3、為什麼WIN7發hello的時候的nginx就會迴應hello,而WINXP發hello時nginx就會回Alert呢? 我們來展開WIN7和WINXP的hello包來仔細看下。(可以看到WIN7的hello包中攜帶了Extension:server_name欄位,並且裡面包含了要訪問的域名資訊。而反觀WINXP則沒有該欄位)

 

4、那WINXP換用其他瀏覽器能不能解決這個問題呢?(換用搜狗瀏覽器試下,結果發現可以訪問了。抓包發現搜狗瀏覽器在傳送SSL的hello包時會攜帶Extension:server_name欄位,並且還附帶了一大堆其他引數)

 

 

五、總結:

WINXP在使用IE訪問https網站時,對方伺服器不能使用SNI方式進行分流,不然會因為不能建立SSL握手而訪問失敗

 

 

附:解決方案

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

2、服務端通過IP地址進行分流(WINXP雖不攜帶訪問的域名資訊,但它總有三層包頭吧!)(推薦)

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

&n