為什麼 curl 而不是 wget 對 software.download.prss.microsoft.com 存在信任問題?
以下 URL 重定向到 microsoft.com 子域:https ://tb.rg-adguard.net/dl.php?go= 3dd1ce66 即
https://software.download.prss.microsoft.com/db/Win10_20H2_v2_EnglishInternational_x64.iso?t=...
(...
作為隨機令牌)我能夠通過執行獲得最終的重定向 URL:
curl -LsI -o /dev/null -w %{url_effective} "https://tb.rg-adguard.net/dl.php?go=7e583fea
但無論我是跑步
wget https://tb.rg-adguard.net/dl.php?go=3dd1ce66
還是wget https://software.download.prss.microsoft.com/db/Win10_20H2_v2_EnglishInternational_x64.iso?t=...................
使用 Firefox 下載文件時,我總是遇到證書錯誤。
wget https://software.download.prss.microsoft.com/db/Win10_20H2_v2_EnglishInternational_x64.iso\?t\=................... --2022-04-12 14:57:29-- https://software.download.prss.microsoft.com/db/Win10_20H2_v2_EnglishInternational_x64.iso?t=.......................... Resolving software.download.prss.microsoft.com (software.download.prss.microsoft.com)... 152.199.21.175, 2606:2800:233:1cb7:261b:1f9c:2074:3c Connecting to software.download.prss.microsoft.com (software.download.prss.microsoft.com)|152.199.21.175|:443... connected. ERROR: The certificate of ‘software.download.prss.microsoft.com’ is not trusted.
為什麼不同應用程序(Firefox 與 wget)的行為不一致。實際上是否有理由不信任該證書(如果是的話,為什麼 Firefox 沒有擷取該證書)或者 wget 有錯?
我正在使用帶有 Wget 1.21.2 和 Firefox 98.0 的 Fedora 35 x64。
什麼壞了
看起來您已經在這個已知問題上絆倒了:https ://github.com/dotnet/core/issues/6830最後一條評論內容如下:
OneOCSP 方面的更新:由於新的 CAB 論壇要求,OneOCSP 將在 2022 年 5 月 31 日之前將算法切換到 SHA-256。
根據該問題,
wget
(GnuTLS) 拒絕接受 Microsoft 證書,因為它具有 OCSP URLURI:http://oneocsp.microsoft.com/ocsp
,並且 oneocsp.microsoft.com 正在使用 SHA1 對其響應進行簽名。 SHA1 已被貶值,強烈建議不要在簽名中使用。可以說 wget 通過保護您的安全正在做正確的事情。SHA1 多年來一直被認為是不安全的,並且幾年來一直不支持使用它來簽署證書。
這實際上是非常令人驚訝的,它沒有被更快地發現和修復。但是我想 OCSP 對使用者來說比 x509 證書本身更不可見。
為什麼這是個問題?
OCSP解決了在證書過期之前撤銷證書的問題。證書可以包含指向伺服器的 OCSP URL。客戶端將閱讀此內容並要求伺服器驗證證書仍然有效且未被撤銷。
伺服器簽署響應以說明證書有效,並且此響應很快就會過期(幾秒或幾分鐘)。所以即使證書本身是有效的,OCSP 伺服器仍然需要在那裡進行確認。
但微軟的 OCSP 伺服器表現不佳……
數字簽名實際上為文件簽署了數字指紋,而 SHA1 以前用於創建指紋。但是人們發現了一種方法來製作與現有 SHA1 指紋匹配的新文件,這樣他們就可以偽造一個看起來與現有簽名匹配的文件!
因此 GNUTLS 拒絕信任某些 Microsoft 證書,因為它拒絕信任來自 Microsoft OCSP 伺服器的 SHA1 簽名響應。因此無法確定證書本身是否已被吊銷。
展示我的工作…
我能夠使用 openssl 確認證書的 OCSP URL。首先通過獲取證書:
openssl s_client -showcerts -servername software.download.prss.microsoft.com -connect software.download.prss.microsoft.com:443 </dev/null
然後將證書複製粘貼到文件中並使用以下命令讀取它們:
openssl x509 -in <filename> -text
如果你好奇Google是如何讓我遇到帽子問題的:
我在
wget
啟用 gnutls 調試選項的情況下執行:GNUTLS_DEBUG_LEVEL=2 wget --verbose https://tb.rg-adguard.net/dl.php?go=3dd1ce66
這在最後給出了一個非常長的調試輸出:
gnutls[2]: looking for key purpose '1.3.6.1.5.5.7.3.1', but have '1.3.6.1.5.5.7.3.4' ERROR: The certificate of ‘software.download.prss.microsoft.com’ is not trusted.
雖然這個錯誤具有誤導性,但它讓我對Google有了更多了解。