为什么curl(而不是wget)与software.download.prss.microsoft.com 存在信任问题?

For*_*vin 4 wget ssl curl certificates

以下 URL 重定向到 microsoft.com 子域:https://tb.rg-adguard.net/dl.php?go=3dd1ce66 \n即https://software.download.prss.microsoft.com/db/Win10_20H2_v2_EnglishInternational_x64.iso?t=...(...是随机令牌)

\n

我可以通过运行以下命令获得最终的重定向 URL:

\n
curl -LsI -o /dev/null -w %{url_effective} "https://tb.rg-adguard.net/dl.php?go=7e583fea\n
Run Code Online (Sandbox Code Playgroud)\n

但无论我跑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=...................

\n

我总是遇到使用 Firefox 下载文件时未遇到的证书错误。

\n
wget https://software.download.prss.microsoft.com/db/Win10_20H2_v2_EnglishInternational_x64.iso\\?t\\=...................\n--2022-04-12 14:57:29--  https://software.download.prss.microsoft.com/db/Win10_20H2_v2_EnglishInternational_x64.iso?t=..........................\nResolving software.download.prss.microsoft.com (software.download.prss.microsoft.com)... 152.199.21.175, 2606:2800:233:1cb7:261b:1f9c:2074:3c\nConnecting to software.download.prss.microsoft.com (software.download.prss.microsoft.com)|152.199.21.175|:443... connected.\nERROR: The certificate of \xe2\x80\x98software.download.prss.microsoft.com\xe2\x80\x99 is not trusted.\n
Run Code Online (Sandbox Code Playgroud)\n

为什么不同应用程序(Firefox 与 wget)的行为不一致。是否确实有理由不信任该证书(如果是的话,为什么 Firefox 没有捕获该证书)或者 wget 出了问题?

\n

我正在使用 Fedora 35 x64、Wget 1.21.2 和 Firefox 98.0。

\n

Phi*_*ing 6

什么坏了

\n

看起来您已经遇到了这个已知问题:https://github.com/dotnet/core/issues/6830最后一条评论如下:

\n
\n

OneOCSP 方面更新:由于新的 CAB 论坛要求,OneOCSP 将在 2022 年 5 月 31 日之前将算法切换为 SHA-256。

\n
\n

根据该问题,wget(GnuTLS) 拒绝接受 Microsoft 证书,因为它具有 OCSP URL URI:http://oneocsp.microsoft.com/ocsp,并且 oneocsp.microsoft.com 正在使用 SHA1 对其响应进行签名。 SHA1 已被弃用并强烈建议不要在签名中使用。

\n

可以说,wget 通过保护您的安全做了正确的事情。多年来 SHA1 一直被认为是不安全的,并且使用它来签署证书已经有几年不受支持了。

\n

事实上,这个问题没有被更早地发现并修复是非常令人惊讶的;但我想 OCSP 对用户来说比 x509 证书本身更不可见。

\n

为什么这是个问题?

\n

OCSP解决了证书过期前吊销的问题。证书可以包含指向服务器的 OCSP URL。客户端将阅读此内容并要求服务器验证证书仍然有效并且尚未被吊销。

\n

服务器签署响应以表明证书有效,并且该响应很快就会过期(秒或分钟)。因此,即使证书本身有效,OCSP 服务器仍然需要在那里进行确认。

\n

但微软的 OCSP 服务器表现不佳......

\n

数字签名实际上是为文档签署数字指纹,并且之前使用 SHA1 来创建指纹。但人们已经发现了一种方法来制作与现有 SHA1 指纹匹配的新文档,这样他们就可以伪造一个看起来与现有签名匹配的文档!

\n

因此,GNUTLS 拒绝信任某些 Microsoft 证书,因为它拒绝信任来自 Microsoft OCSP 服务器的 SHA1 签名响应。因此无法确定证书本身是否已被吊销。

\n

显示我的工作...

\n

我能够使用 openssl 确认证书的 OCSP URL。首先获取证书:

\n
openssl s_client -showcerts -servername software.download.prss.microsoft.com -connect software.download.prss.microsoft.com:443 </dev/null\n
Run Code Online (Sandbox Code Playgroud)\n

然后将证书复制粘贴到文件中并使用以下命令读取它们:

\n
openssl x509 -in <filename> -text\n
Run Code Online (Sandbox Code Playgroud)\n
\n

如果您好奇谷歌是如何引导我解决帽子问题的:

\n

我运行wget时启用了 gnutls 调试选项:

\n
openssl s_client -showcerts -servername software.download.prss.microsoft.com -connect software.download.prss.microsoft.com:443 </dev/null\n
Run Code Online (Sandbox Code Playgroud)\n

这给出了一个非常长的调试输出,最后是这样的:

\n
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\'\nERROR: The certificate of \xe2\x80\x98software.download.prss.microsoft.com\xe2\x80\x99 is not trusted.\n
Run Code Online (Sandbox Code Playgroud)\n

虽然这个错误具有误导性,但它给了我更多的信息来继续谷歌。

\n