1. 程式人生 > >HTTPS中證書鏈不完整的解決方案

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="密碼"
 />