10/1 是什麼日子? 是大陸的國慶黃金假期,從大陸進貨的公司、買淘寶的剁手族要避開這段時期?
那 2021/10/1 是什麼日子? 是網路史上黑暗的日子之一,SSL數位憑證造成的審判日又來了。
這個審判日在去年也發生一次,2020/5/30發生根憑證過期造成Roku、Stripe及Spreedly等眾多服務停擺,今年則是另一家根憑證 Root CA X3 在 9/30 過期,一些瀏覽者在 2021/10/1 起瀏覽網站,可能就會出現「您的連線不是私人連線」「NET::ERR_CERT_DATE_INVALID」的訊息。

常見的免費SSL與優缺點

這邊講的 SSL 數位憑證是真的半毛錢都不用花的,常見的有幾種

用 CDN 就送 SSL

最有名的就屬 Cloudflare,2016年有發公告透過中華電信機房也在台提供服務Taipei: CloudFlare’s 77th Data Center is Now Live,申請完全免費,使用基礎功能也完全不用錢,不知道以後會不會養套殺就是了。

缺點之一是域名 Name Server 要直接設到 Cloudflare 上面去,增添各種數位資產權限管理相關的煩惱,例如客人不給域名帳密,根本沒法用這種方式。
缺點之二是因為機房頻寬有限,可能會被導向海外節點而導致網站變慢,例如現主時我這台電腦查看疫苗預約網站 https://1922.gov.tw/cdn-cgi/trace 的資訊如下,COLO=TPE,還在台灣節點內,如果不幸被導到海外,甚至有可能輸入網址之後要等10秒,非常可怕。
缺點之三是如果沒有購買安裝自己的SSL數位憑證(使用 Flexible, partially secure 的設定),使用一些 server 端程式語法想要做一些判斷或組出網址字串的時候,例如 HttpContext.Current.Request.IsSecureConnection 會得到 false,用 Request.Url.Scheme 會得到 http,嗯…又是一種想要省錢,又是工程師遭殃、增加工時的問題。

1922 cloudflare

CDN77也有提供這種你用他的CDN,他就讓你用免費SSL的服務,但CDN77只有14天免費試用,平常使用是要錢的。

Let’s Encrypt 自動化數位憑證頒發機構

這是於2015年左右推出的自動化數位憑證頒發機構,2018年開始支援 wildcard 型的憑證,網站管理者透過系統指令,即可達成完全無人自動化達成簽發與安裝步驟。他們的理念是為了建立一個更加安全;更尊重隱私的網際網路,所以免費提供用戶數位憑證,並以最友善的方式替網站啟用 HTTPS。Google, Facebook 等知名的全球化網路企業都是他們的贊助商。
如果是使用一些 Linux 環境+CPanel 控制介面的虛擬主機傻瓜型服務,通常也會開放 AutoSSL 的功能讓網站管理員自動簽發,降低不少處理SSL相關作業的成本和時間。

缺點是有效期較短,只有90天,有效期過了當然就要重新簽發,然後還有千百種原因會讓自動排程程式沒執行、或是有執行但是出錯,只要網站的SSL憑證過期,使用者一瀏覽網站馬上就看到錯誤畫面啦!
而且部分的共享主機(虛擬主機)根本不開放管理者使用系統指令或 cerbot 或 acme.sh 之類的工具操作權限,沒辦法直接享受他們的免費SSL。

FreeSSL

上述有提到部分的網頁伺服器廠商有限制,沒有開放管理者使用自動化指令簽發SSL憑證,當然就有一些服務立基於 Let’s Encrypt 或一些其他的憑證機構之上,提供一些網頁介面或其他方式來簽發憑證給網站,並產生相關的金鑰資訊,讓網站管理者可以安裝免費SSL數位憑證在自己主機上。

缺點當然跟上述 Let’s Encrypt 一樣,每 90 天就要重新操作一次,自動化有出錯的機率,手動當然也有,一不小心就有網站的 SSL 忘記更新,非常辛苦。
這些服務本身當然也有一些使用規範或限制,例如 ZeroSSL 每個帳號可以申請的免費 SSL 憑證數量是有限制的,要多申請得繳錢變付費會員,或是像 FreeSSL.cn 需要實名制認證,註冊時要填寫大陸的手機號碼。

免費的 SSL 雖然沒有什麼麻煩的身分驗證層級(電話驗證、Email 驗證等等)、沒有保固金額、沒有真人客服、沒有標章圖片(Site Seal)之類的,但安裝免費 SSL 的絕非貪小便宜之徒,例如因為付費 SSL 通常都是1年,有時候系統還在開發測試期間,或是付費憑證申請還沒下來,或是請款流程還在跑,都會讓網站有空窗期,很適合拿免費 SSL來頂一陣。

DST Root CA X3 根憑證過期,真的只有舊裝置會出問題?

依照 Let’s Encrypt 的憑證信任鍊上 所述,Let’s Encrypt 的憑證會由 DST Root CA X3 根憑證或 ISRG Root X1 根憑證所簽發,而 DST Root CA X3 的根憑證在 2021/09/30 22:01:15 (台灣時間) 過期,有持續更新的電腦或手機設備,用戶端的瀏覽器還會有 ISRG Root X1 的根憑證可以繼續用,而久未更新的作業系統或伺服器環境,瀏覽使用了 Let’s Encrypt 的網站,將會讓使用者看到SSL連線失敗、NET::ERR_CERT_DATE_INVALID之類的訊息。

官方說法是這麼講,起初看起來覺得沒什麼,大家的 iPhone 每幾年就換新,現代電子產品的過保固就故障的製程技術很高超,哪有什麼舊設備?
一看官方列的憑證相容性清單
Android < v2.3.6?
Nintendo 3DS?
Windows XP SP3 以前的版本?
Safari < v4.0 on macOS?
Safari on iOS < v3.1?
看起來更是高枕無憂

先不談 Windows XP SP1, SP2 不支援 DST Root CA X3 根憑證的問題,談到便宜的 SSL 一定要談論到 SNI(Server Name Identification),就是早期網站要安裝 SSL 數位憑證,虛擬主機商還會收一筆固定 IP 費用(現在有些主機商也還是有),直到後來不支援 SNI 的瀏覽器逐漸被淘汰,這種 IP SSL 才比較銷聲匿跡,便宜的網站使用的 SSL 憑證轉為比較常見的 SNI SSL。
而 Windows XP 的 IE 瀏覽器在 SNI(Server Name Identification) 的支援度就很有問題,這幾年瀏覽安裝了 SNI SSL 的網站老早就會看到各種安全性警告,還用等到 2021 的 10 月?

恐怖的事來了,10/1之後,有些使用者,打開網站就是會 NET::ERR_CERT_DATE_INVALID,一看憑證資訊,根憑證 DST Root CA X3 還死死的守在根憑證的位置,就是沒有自動換成 ISRG Root X1。

遇到發生問題的機器
– 從 MacOS 10.x 到最新的 MacOS BigSur 11.6 都有,用 Google Chrome 跟 Safari 都打不開,Google Chrome 的訊息是 NET::ERR_CERT_DATE_INVALID
– Android 9 的手機,用 Android Browser 和 Microsoft Edge 正常,用 Google Chrome 會 NET::ERR_CERT_AUTHORITY_INVAILD
– iOS12.5 的 iPad,用 Google Chrome 跟 Safari 都打不開,Google Chrome 的訊息是 NET::ERR_CERT_DATE_INVALID

更複雜的是,不一定每個 MacOS/Android 9/ iOS12.5 瀏覽該網站一定都會發生錯誤,一樣版本作業系統的其他裝置去瀏覽可能又正常,同一個網站用 Windows 10 或 iOS 13~15 瀏覽也都正常,用 SSLLab 檢測網站的 Handshake Simulation 也都是正常,client 端裝置清過 HSTS 也沒效。


(右邊 server cert 那層的名字因為保密被我塗掉了,本來是正常有名字的)

上網找看看有沒有什麼解法?

遠振科技 – 使用 Let’s Encrypt SSL 憑證服務的客戶請留意,解決方法是:

目前尚未發現使用付費SSL憑證的網站有出現網站訪客無法造訪網站或出現不安全提示的問題,因此建議網站管理員可以先購買一年期SSL憑證來使用以解決目前遭遇的問題。

這一篇完成DST Root CA X3證書產生的問題已經開始裡面則是寫到(整篇文章的中文機器翻譯怪怪的,因為原文是西班牙文)

macOS 和 iOS 版本(11、13、14)中的錯誤,理論上應該不會受到問題的影響。

Lets Encrypt 免費 SSL憑證更新公告 | URL@智邦生活館 也提到相關問題

若您是自行於 sslforfree.com / zerossl.com 申請憑證,或使用 cPanel/Plesk管理後台進行安裝,須請您重新安裝一次憑證,更新後仍有部份舊款手機(例如,iPhone 4 或 HTC Dream)因已不再更新作業系統與SSL安全性套件,所以無法兼容此次根憑證更新,不便之處請見諒。

這一篇則是羅列了各大系統的解法 Certify The Web Docs – Possible issues

In some cases, the expiry of the root (and its related expiring R3 intermediate certificate) may causes certificates to be considered untrusted or invalid. To fix this you need to make your server use (serve) the correct chain.
In other cases, the issue may be with the client computer.

簡而言之,某些人的裝置明明沒有那麼舊,但瀏覽某些安裝了 Let’s Encrypt 免費 SSL 憑證的網站,就是打不開網站。

MacOS 手動更新憑證

根憑證是在使用者的裝置裡面的,其中一台問題裝置依照 Certify The Web Docs 內的指示就正常了。

1.在這個連結 http://x1.i.lencr.org/ 下載 ISRG Root X1 根憑證檔案,(註:此下載連結是 let’sencrypt 提供的連結,若有安全疑慮可以看這邊的說明 https://letsencrypt.org/docs/lencr.org/ )
2.打開「鑰匙圈存取」的app,把剛剛下載的檔案放進去
3.找到 ISRG Root X1 憑證,在信任裡面把使用此憑證時「使用系統預設」調整為「永遠信任」。
4.會提示輸入系統密碼。完成後再次瀏覽有問題的網站,過期的 DST Root CA X3 就換成 ISRG Root X1 的了

還要讓使用者自己設定電腦畢竟是下下策,但是不只自己的網站,一堆外面的網站也都上不了,只能先這樣處理。

不過還是有些電腦即使這樣安裝憑證之後也沒法解決,網站管理者真的只能幫網站重簽一張新的憑證。或是乾脆到 CheapSSL 買1年期的便宜付費憑證裝上去。

還好俺不是修電腦的,不然要是這幾天接到客人一直問網站打不開、出現不安全連線,可能會崩潰OAO,那不是他賣出去的電腦有問題呀,是網站、瀏覽器、數位憑證在搞事呀。