更新 1

更新 1

在 PC 重新配置后,我无法正常使用 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 本身引起的(?)。

serverfault/stackoverflow 上有不少相关问题,但我找不到真正适用于这种情况的解决方案:

顺便说一句,我在一家企业工作,使用的是 IT 发布的操作系统。显然这可能是错误来源,但他们无法帮助我调试此问题。然而,在同事的 PC 上,它运行完美。

有任何想法吗?


PC设置:

  • Windows 10 企业版
    • 版本:21H1
    • 操作系统内部版本:19043.1645
    • Windows 功能体验包:120.2212.4170.0
  • 带有 Ubuntu-20.04 的 WSL 2
  • Docker Desktop 4.7.1(77678)基于 WSL 2 引擎

更新 1

根据@Martin的建议,我尝试下载https://www.amazontrust.com/repository/AmazonRootCA1.pem,将其放入/tmpWSL Ubuntu 中,然后重新运行命令,curl --cacert /tmp/AmazonRootCA1.pem -vfsSL https://apt.releases.hashicorp.com/gpg但无济于事:

curl --cacert /tmp/AmazonRootCA1.pem -vfsSL https://apt.releases.hashicorp.com/gpg
*   Trying 52.222.214.72:443...
* TCP_NODELAY set
* Connected to apt.releases.hashicorp.com (52.222.214.72) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /tmp/AmazonRootCA1.pem
  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.

答案1

我们终于搞清楚了。问题在于 IT 部门安装了一个防火墙,该防火墙会拦截 SSL 连接(许多防火墙这样做是为了能够阻止“恶意”流量,这些流量会因为加密而不被检测到)。

为了能够拦截 SSL 连接,防火墙会将其自己的证书放在链接上,并充当代理。问题就出在这里:docker 容器不信任防火墙使用的 CA,因此拒绝建立连接。显然,对于您的 Windows 计算机,CA 已经添加到信任存储中 - 这也需要为您的 docker 容器完成 - 或者您需要在--insecurecurl 命令中添加开关以忽略这些证书错误。

请注意,curl 正确地抛出了错误,因为 https - 证书机制是为了能够检测“中间人”攻击而发明的 - 而这正是这里发生的事情。(我将在这里跳过我关于防火墙破坏 SSL 安全性以便能够检查数据包内容的观点......)

要解决此问题,您需要网关的 CA 文件来“签署”所有这些证书,并将此 CA 添加到受信任的列表中。

为了完整起见,这是您看到的证书:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            6a:7b:6c:fd:70:b2:68:1a:56:e3:11:3c:43:ed:ae:29
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C = US, ST = California, L = Sunnyvale, O = Bad Server Certificate [invalid server certificate], CN = Bad Server Certificate
        Validity
            Not Before: Jan 26 07:08:23 2011 GMT
            Not After : Nov 11 07:08:23 2284 GMT
        Subject: CN = apt.releases.hashicorp.com
[cut]

这是原始版本:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            03:57:ef:0e:70:b2:68:1a:56:e3:11:3c:43:ed:ae:29
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
        Validity
            Not Before: Apr 27 00:00:00 2022 GMT
            Not After : May 26 23:59:59 2023 GMT
        Subject: CN = apt.releases.hashicorp.com

答案2

以下是基于@Martin 的回答和@casparjespersen 的评论的完整步骤

下载证书

这些步骤都可以通过 Windows GUI 完成。

  1. 打开证书管理器(Start > Run > certlm.msc
  2. 在文件夹中找到证书Trusted Root Certification Authorities\Certificates。应命名为Zscalar Root CA
  3. 右键单击它,然后选择All Tasks > Export...
  4. 点击Next
  5. 选择Base-64 encoded X.509 (.CER)选项
  6. 将文件保存到可以从 WSL 访问的位置

在 Ubuntu 中安装 CA 证书

在 WSL 终端内执行这些步骤。这些步骤本质上是将证书移动到一个特殊目录中,该目录由进程读取update-ca-certificates,然后生成一个包含新证书的新受信任存储。请参阅此文档了解更多信息。

  1. sudo apt-get install -y ca-certificates安装必要的命令
  2. sudo cp /mnt/c/path/to/cert.cer /usr/local/share/ca-certificates/zscalar.crt
  3. sudo update-ca-certificates更新证书存储

笔记:步骤 2 与发布的链接不同,它将扩展名从 更改为.cer.crt根据上面链接的文档,“文件必须具有 .crt 扩展名,否则将无法处理”。只需更改扩展名即可,您不需要进行任何进一步的修改。请参阅这篇文章了解有关这两个扩展之间的差异的更多信息。

验证是否成功

只需使用 HTTPS 协议执行 cURL 命令就可以成功。

curl https://serverfault.com

答案3

在 wsl 中

sudo nano /etc/wsl.conf

取消注释:

[network]
generateHosts = false

相关内容