在wsl2 windows中运行该命令将得到以下输出。有人能解释一下为什么TLSv1.3和TLSv1.2的IN和OUT是混合的吗?这是为什么无法获得本地颁发者证书的潜在原因吗?Windows主机操作系统为Enterprise
我已经安装了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
您是否使用受监控或防病毒等"保护"的网络连接,例如由企业,组织或学校提供的网络连接?如果是这样,你可能从拦截器得到一个假的证书/链。
尝试openssl s_client -connect google.com:443
,并查看Certificate chain
下的s:
和i:
线。(今天许多主机需要SNI正确响应,如果你的OpenSSL低于1.1.1,你需要添加-servername x
来提供SNI,但谷歌不是其中之一,无论如何,因为你的curl至少在尝试1.3,它不可能是低于1.1.1的OpenSSL。)
或者,如果从Chrome, Edge或IE(但可能不是Firefox)在主机Windows上连接正常,双击挂锁并查看证书链,看看它是否导致GlobalSign根CA(如真正的谷歌)或其他东西(如BlueCoat);如果是后者,则拦截器的根证书安装在您的主机Windows存储中,而不是WSL系统中。您可以从主机浏览器导出证书并将其放入文件中,或者使用curl --cacert $file
手动使用它,或者将其导入WSL系统的信任库,但这取决于您在WSL中运行的是什么系统,您没有说。
添加:TLS 1.3和1.2在日志信息中的混合是可能是,因为1.3使用与1.2相同的记录头版本作为转换hack,扩展表明它实际上是1.3只有在两个Hello消息中,回调可能不处理这个。
原来有丢失的证书,一旦提供和安装它工作正常