以下 URL 重定向到 microsoft.com 子域:https://tb.rg-adguard.net/dl.php?go=3dd1ce66
即 to 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 出了问题?
我使用的是 Fedora 35 x64、Wget 1.21.2 和 Firefox 98.0。
答案1
什么坏了
看起来您已经被这个已知问题绊倒了: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
如果你好奇谷歌是如何引导我解决帽子问题的:
我运行时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.
虽然这个错误具有误导性,但它给了我更多的信息来继续谷歌。