在 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,将其放入/tmp
WSL 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 容器完成 - 或者您需要在--insecure
curl 命令中添加开关以忽略这些证书错误。
请注意,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 完成。
- 打开证书管理器(
Start > Run > certlm.msc
) - 在文件夹中找到证书
Trusted Root Certification Authorities\Certificates
。应命名为Zscalar Root CA
。 - 右键单击它,然后选择
All Tasks > Export...
- 点击
Next
- 选择
Base-64 encoded X.509 (.CER)
选项 - 将文件保存到可以从 WSL 访问的位置
在 Ubuntu 中安装 CA 证书
在 WSL 终端内执行这些步骤。这些步骤本质上是将证书移动到一个特殊目录中,该目录由进程读取update-ca-certificates
,然后生成一个包含新证书的新受信任存储。请参阅此文档了解更多信息。
sudo apt-get install -y ca-certificates
安装必要的命令sudo cp /mnt/c/path/to/cert.cer /usr/local/share/ca-certificates/zscalar.crt
sudo update-ca-certificates
更新证书存储
笔记:步骤 2 与发布的链接不同,它将扩展名从 更改为.cer
。.crt
根据上面链接的文档,“文件必须具有 .crt 扩展名,否则将无法处理”。只需更改扩展名即可,您不需要进行任何进一步的修改。请参阅这篇文章了解有关这两个扩展之间的差异的更多信息。
验证是否成功
只需使用 HTTPS 协议执行 cURL 命令就可以成功。
curl https://serverfault.com
答案3
在 wsl 中
sudo nano /etc/wsl.conf
取消注释:
[network]
generateHosts = false