使用 python 的 docker 中唯一的本地颁发者证书错误

问题描述 投票:0回答:2

以下错误仅在 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。

我试过:

  1. RUN update-ca-certificates
  2. 安装
    certfi
    库并在调用过程中手动提供证书
  3. certify
    /usr/local/share/ca-certificates/
    /etc/ssl/certs/
    等docker镜像的不同位置手动插入
    RUN update-ca-certificates
  4. 库自带的证书
  5. 尝试了 python 的不同版本(
    3.6.9
    3.8.4
    )和提供程序(
    alpine
    buster
    slim-buster
    )。
  6. 设置不同的环境变量,如
    REQUESTS_CA_BUNDLE
    SSL_CERT_FILE
  7. 使用不同的库如
    requests
    ,
    urllib
    ,
    urllib3

....而且真的有很多不同的东西。

关闭验证当然可以,但我想继续验证

python docker ssl url ssl-certificate
2个回答
6
投票

我在 ARM Ubuntu 20.04 容器中遇到了这个问题。

我安装了ca-certificates和curl,但是还是不能用curl。对我来说,修复最终是在调用 curl 之前添加以下内容:

export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt

0
投票

如果您使用 tornado.httpclient.HTTPRequest 设置选项 ca_certs 可能会产生此结果,尽管使用中的 ca_cert 文件应该定义另一方使用密钥文件提供的 pem 文件的父级。 这似乎是覆盖可能指向包含所需证书文件的目录的默认值的结果。在某些情况下,可以省略 ca_cert 参数并忽略包含的 ca_certs。 Curl 甚至 ssl.wrap_socket over socket 仍然可以使用完全相同的参数,但 tornado.httpclient.HTTPRequest 不能。 这里真正的问题是许多库无法告诉您正在考虑哪些证书以及为什么,以及缺少哪些证书。

© www.soinside.com 2019 - 2024. All rights reserved.