此連線並非私人連線? 檢查你的SSL設定等級!

此連線並非私人連線? 檢查你的 SSL 設定等級!

問題

日前網站被回報說 用 Safari 開啟時會顯示「此連線並非私人連線」
一開始是覺得很奇怪,憑證應該是沒有問題的(不是自簽的而且是政府單位核發的)
透過 Chrome 或是 Firefox 開啟時,都是沒有問題的
當然是可以透過把這個網站的憑證加入到 Mac 的鑰匙圈存取上
手動信任這個網站 來規避問題
不過還是要解決才來得痛快

檢查原因

要檢查自己的 SSL 設定是否完善
可使用 SSL Labs 檢測的服務
他會偵測你 SSL 設定存在哪些問題、疑慮
並且給出一個安全等級的分數

我的檢測結果為 B 級
原因是檢查出「This servers’s certificate chain is incomplete.」的問題

什麼是 Certificate Chain ?

Certificate Chain 中文可翻作 憑證串鏈、信任鏈、數位憑證鏈…等等

憑證主要分三種:

  • 根憑證(Root Certificate)
  • 中繼憑證(Intermediate Certificate)
  • 終端憑證(End-Entity Certificate)

“通常”是階級式的驗證,像資料結構的樹一樣,根憑證就是根節點,終端憑證是葉節點,其他都是中繼憑證。

使用網頁瀏覽器造訪一個網站,會執行認證路徑驗證演算法,使用該主機提供的電子憑證,驗證是否能夠對應到預先安裝的根憑證,從而驗證從根憑證到終端節點的路徑是否為一條有效的信任鏈,確保 TLS 安全連接中的身分。

簡單來說,憑證是否安全有效,是由一連串的憑證驗證組成的

解決問題

在一般情況下,瀏覽器會自動找到對應的 Certificate Chain
(憑證中會含有簽發者個資訊,可以一路找下去)
所以在 Chrome 及 Firefox 中才沒有遇到這個問題

不確定為什麼 Safari 會有這個問題
但是除了 Safari 以外
如果是用 cURL 或是在沒有 internet 環境的網路
也無法透過網路去找到 Certificate Chain
所以最好的做法就是加上完整的中繼憑證

加上中繼憑證

根據 Stack Overflow 上的一篇解答
SSL: Servers certificate chain is incomplete

  • open your site in a browser
  • click on green padlock and display certificate properties
  • export every certificate in the chain
  • install new cert on server
  • test nginx cofiguration nginx -t
  • restart server service nginx restart

提到一個快速的解法是
在可以成功連線的瀏覽器上 直接匯出金鑰練
並且加入到你目前的憑證中
然後重啟 Nginx 設定

操作範例

以 Firefox 為例來操作

找到檢視憑證後的地方後可以看到
上面那一串就是這個憑證的 Certificate Chain

瀏覽器有提供下載金鑰練的功能

打開後的結構會是一連串的

-----BEGIN CERTIFICATE-----
憑證內容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
憑證內容
-----END CERTIFICATE-----
...

看你有幾個憑證節點 就會有幾個 BEGIN … END

最終更新原本網站的憑證
然後刷新 Nginx 設定 ( reload 後才會生效 )

完成後再測驗一次
拿到了 A 級
(最高可以到 A+ 的 100 分,不過也會犧牲一些效能及支援度)

最後當然也就可以成功在 Safari 上正常瀏覽網站啦!
灑花~

回顧一下本文的重點

  • 利用 SSL Labs 檢查網站
  • Certificate Chain 是什麼
  • 如何加上完整的 Certificate Chain
  • 要支援 Safari 瀏覽器需要注意 SSL 的問題

參考資料