此連線並非私人連線? 檢查你的 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 的問題