Curl

為什麼 curl 而不是 wget 對 software.download.prss.microsoft.com 存在信任問題?

  • April 21, 2022

以下 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 URL URI: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有了更多了解。

引用自:https://unix.stackexchange.com/questions/698856