WSL-Docker: curl: (60) SSL证书问题:无法获取本地颁发者证书

8
在电脑重新配置后,我无法正确使用Docker,因为一些curl命令由于SSL/TLS问题而被拒绝。例如,curl -vfsSL https://apt.releases.hashicorp.com/gpg 返回以下错误:
*   Trying 52.222.214.125:443...
* TCP_NODELAY set
* Connected to apt.releases.hashicorp.com (52.222.214.125) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (OUT), TLS alert, unknown CA (560):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

经过一番调查,我现在知道这个问题也出现在我的WSL映像中,但在主机Windows操作系统上没有出现。因此,我认为这必须是源于我的WSL设置的问题,而不是Docker本身引起的问题(?)。
StackOverflow上有很多相关的问题,但我发现没有一个解决方案真正适用于这种情况(而禁用验证通常是一个建议的解决方案,这并不可行):

就我个人而言,我在一家企业工作,使用由IT部门提供的操作系统。显然这可能是错误的源头,但他们无法帮助我调试此问题。然而,在我的同事的电脑上,它可以完美地运行。

有任何想法吗?


PC设置:

  • Windows 10企业版
    • 版本:21H1
    • OS构建版本:19043.1645
    • Windows功能体验包:120.2212.4170.0
  • WSL 2与Ubuntu-20.04
  • Docker Desktop 4.7.1(77678),使用基于WSL 2的引擎

你在主机上使用的是Windows提供的curl,即\windows\system\curl.exe吗?curl -V是否显示为libcurl/{ver} Schannel(而不是openssl、gnutls或nss)?如果是这样,可能是因为你的计算机上有AV/ES,或者企业网络中有WAF/DLP等拦截你的流量,并使用推送到Windows存储中但Ubuntu未知的根证书。在浏览器中,如果你访问(虚拟)顶级页面https://apt.releases.hashicorp.com/并查看证书链,它是Amazon CA 1BAmazon Root CA 1还是其他内容? - dave_thompson_085
@dave_thompson_085 正确。我的Windows cURL是“curl 7.79.1(Windows)libcurl/7.79.1 Schannel”,而Ubuntu是“curl 7.68.0(x86_64-pc-linux-gnu)libcurl/7.68.0 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh/0.9.3/openssl/zlib nghttp2/1.40.0 librtmp/2.3”。在浏览器中,https://apt.releases.hashicorp.com/的证书链为“Zscaler Root CA”。 - casparjespersen
Zscaler是用于拦截HTTPS流量的设备制造商之一,因此需要将其根证书(适用于您的环境)添加到软件使用的信任存储区。Ubuntu上的大多数库和程序(包括curl)都使用其系统存储区;请参阅“man update-ca-certificates”以了解如何添加。_某些_程序可能会有所不同;如果是这样,您将不得不识别它/它们。我非常确定DockerDesktop使用Windows存储区(已经设置好),但不能保证。(我的意思是像FROM镜像这样的docker访问,而不是在容器中运行的东西。) - dave_thompson_085
1个回答

18

我在公司遇到了类似的问题。

问题是我们的防火墙替换了证书。

我的wsl设置中无法信任/识别防火墙证书。

我通过从Windows certmanager (certmgr.msc)导出防火墙证书来解决此问题。

证书位于"Trusted Root Certification Authorities\Certificates"

将证书导出为编码为DER的x.509格式,保存在例如"D:\eset.cer"下。

输入图像说明

在 WSL 中,您可以使用以下命令添加证书:

openssl x509 -inform DER -in /mnt/d/eset.cer -out ./eset.crt
sudo cp eset.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

这篇文章救了我的一天。起初,我以为问题出在Windows上,但当我看到这篇 https://serverfault.com/a/1100505/989358时,我有点确信问题是来自WSL2。但是评论和答案缺乏很多清晰度,以至于我仍在努力解决问题,直到我找到这个答案和列出的步骤来解决问题。 - Hemangi Gokhale
2
谢谢!在我的情况下,我们使用Zscaller(防火墙),因此我需要复制“Zscaler根CA”证书。 - Georgi Koemdzhiev
对我来说也是一样的,“在我的情况下,我们使用Zscaller(防火墙),所以我需要复制Zscaler根CA证书。” - undefined
这实际上帮助了我解决了证书的持续问题。我的公司也在使用相同的zscaler根证书。非常感谢! - undefined
我的公司也在使用Zscaler,我尝试了上述步骤,将我的Zscaler根证书导出并复制到ca-certificates文件夹中,然后运行了'update-ca-certificates'命令。但是我仍然遇到了问题,有人可以帮我吗?错误 - (由SSLError引起的SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)' - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接