卷曲请求 TLS 警报,Windows WSL 中的未知 CA

Curl Request TLS alert, unknown CA in Windows WSL

运行 wsl 2 windows 中的此命令提供以下输出。 任何人都可以解释为什么混合使用 TLSv1.3 和 TLSv1.2 IN 和 OUT,这是否是它无法获得本地颁发者证书的潜在原因。 Windows 主机 OS 是企业

我已经安装了 ca-certificates 和 运行 update-ca-certificates

curl -v https://google.com:443/
* Trying 172.217.169.78...
* TCP_NODELAY set
* Connected to google.com (172.217.169.78) 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.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (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

您是否正在使用受监控或 'protection' 的网络连接,例如由企业、组织或学校提供的防病毒软件?如果是这样,你可能从拦截器那里得到了一个假的 cert/chain。

尝试 openssl s_client -connect google.com:443 并查看 Certificate chain 下的 s:i: 行。 (许多 主机今天需要 SNI 才能正确响应,如果 你的 OpenSSL 低于 1.1.1 你需要添加 -servername x 来提供 SNI ,但 google 不是其中之一,而且由于您的 curl 至少在尝试 1.3,因此它不能是低于 1.1.1 的 OpenSSL。)

或者,如果从 Chrome 连接,主机 Windows 上的 Edge 或 IE(但可能不是 Firefox)工作正常,双击挂锁并查看证书链以查看它是否导致到 GlobalSign Root CA(就像真正的 google 所做的那样)或其他东西(例如 BlueCoat);如果是后者,则拦截器的根证书安装在您的主机 Windows 存储中,而不是 WSL 系统中。您可以从主机浏览器导出证书并将其放入文件中,然后通过 curl --cacert $file 手动使用它,或者将其导入 WSL 系统的信任库,但这取决于您使用的是什么系统 运行在你没说的WSL中​​。

补充:日志信息中 TLS 1.3 和 1.2 的混合是 可能 因为 1.3 使用与 1.2 相同的记录头版本作为转换 hack,扩展名表明真的是1.3只在两条hello消息里,回调应该不会处理这个。

事实证明缺少证书,一旦提供并安装它就可以正常工作