HTTPS中證書鏈不完整的解決方案
問題
tomcat8.5配置pfx格式ssl證書後,https可以正常訪問,但是(問題與下面這個情況相同):
由於我們的部分業務場景是在微信(WebView)中開啟https的web頁面,在測試過程中卻發現了一個問題,在Chrome中測試完全正常的https頁面,在iOS的微信(WebView)中表現正常,但在Android中,不論是哪個版本的安卓系統,都不能正常開啟頁面,要麼就是一片白,要麼就是直接無法開啟,解決這個問題,需要在伺服器上配置完整的SSL證書鏈。
ssllab的證書測試更詳細,完全截圖的話圖太多,就只貼兩張關鍵位置的:
chain issues 這裡會顯示Certificate Chain Incomplete(圖是問題解決後截的)
握手模擬這裡的絕大多數Android版本(低版本)會像下圖第一行一樣 No FS,也就是說Android瀏覽器打不開網站(圖也是後來截的,沒查到FS是什麼意思,大佬求告知)
關於SSL證書
看了下面這些介紹差不多能有個大體的認識,想完全理解還需要多下功夫
其中CRT與CER可以理解成相同的格式,一個用於Linux,一個用於Windows.
中間證書
證書鏈Certificate Chain與中間證書指的應該是同一個東西
證書鏈其實就是描述證書的簽名環節,就比如是 A 頒發證書給 B ,B頒發證書給C,然後我們手裡的就是證書C。當證書鏈不完整的情況下,也就是沒有描述我們手中的證書C是由誰辦法的,所以導致的瀏覽器不認為你這個證書是可信的授權證書。
每個裝置中都會存有一些預設的可信的根證書,但很多CA是不使用根證書進行簽名的,而是使用中間層證書進行簽名,因為這樣做能更快的進行替換(這句可能不對,原文是 because these can be rotated more frequently)。
如果你的伺服器上沒有中介軟體證書,這樣的結果就是你的伺服器上只有你的網站的證書,客戶端的瀏覽器裡只有CA的根證書,這樣就會導致證書信任鏈不全,才導致了上面那兩個截圖中的問題。這種中間層證書不全的問題多出現在移動端的瀏覽器上(就我目前看,iOS8 iOS9 都沒有出現問題,Andorid各個版本都有這個問題)。
當你伺服器上的證書中的信任鏈不全的情況下,瀏覽器會認為當前的連結是一個不安全的,會阻止頁面的開啟。
解決方案
問題的原因是沒有配置中間證書,那解決方案自然是加上中間證書
獲取中間證書
有的證書服務商沒給中間證書,沒關係,我們可以從crt證書檔案中解析出來
線上工具
當然也可以線下利用ssl工具或者openssl命令等自己解析,方法自行百度
新增中間證書
從SSL證書服務商那裡,獲得的crt證書檔案大概是這個樣子的:
-----BEGIN CERTIFICATE-----
# 證書內容
-----END CERTIFICATE-----
在你加上中級證書後,新的crt證書檔案看起來是這樣的:
-----BEGIN CERTIFICATE----- # 證書內容 1 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- # 證書內容 2 -----END CERTIFICATE-----
然後再用這個新的證書和key檔案轉化出pfx格式證書就OK了
Tomcat配置
<Connector
port="443"
protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="200"
scheme="https"
secure="true"
SSLEnabled="true"
clientAuth="false"
sslProtocol="TLS"
keystoreFile="d:/server.pfx"
keystoreType="pfx"
keystorePass="密碼"
/>