以下错误仅在 python 中的 docker 应用程序向 https url 发出请求时发生。
<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)>
在 docker 之外,该应用程序可以正常工作。我可以在其他语言应用程序(例如 dotnet)的 docker 图像中获取相同的 URL。
我试过:
RUN update-ca-certificates
certfi
库并在调用过程中手动提供证书certify
、/usr/local/share/ca-certificates/
、/etc/ssl/certs/
等docker镜像的不同位置手动插入
RUN update-ca-certificates
3.6.9
、3.8.4
)和提供程序(alpine
、buster
、slim-buster
)。REQUESTS_CA_BUNDLE
、SSL_CERT_FILE
等requests
, urllib
, urllib3
....而且真的有很多不同的东西。
关闭验证当然可以,但我想继续验证
我在 ARM Ubuntu 20.04 容器中遇到了这个问题。
我安装了ca-certificates和curl,但是还是不能用curl。对我来说,修复最终是在调用 curl 之前添加以下内容:
export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
如果您使用 tornado.httpclient.HTTPRequest 设置选项 ca_certs 可能会产生此结果,尽管使用中的 ca_cert 文件应该定义另一方使用密钥文件提供的 pem 文件的父级。 这似乎是覆盖可能指向包含所需证书文件的目录的默认值的结果。在某些情况下,可以省略 ca_cert 参数并忽略包含的 ca_certs。 Curl 甚至 ssl.wrap_socket over socket 仍然可以使用完全相同的参数,但 tornado.httpclient.HTTPRequest 不能。 这里真正的问题是许多库无法告诉您正在考虑哪些证书以及为什么,以及缺少哪些证书。