【问题标题】:urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1076)urllib.error.URLError: <urlopen 错误 [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1076)
【发布时间】:2020-05-23 15:24:19
【问题描述】:

我在以下 python 代码中遇到证书错误,在 docker 容器 laudio/pyodbc 中运行

  File "/usr/local/lib/python3.7/site-packages/fredapi/fred.py", line 131, in get_series
    root = self.__fetch_data(url)
  File "/usr/local/lib/python3.7/site-packages/fredapi/fred.py", line 64, in __fetch_data
    response = urlopen(url)
  File "/usr/local/lib/python3.7/urllib/request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/local/lib/python3.7/urllib/request.py", line 525, in open
    response = self._open(req, data)
  File "/usr/local/lib/python3.7/urllib/request.py", line 543, in _open
    '_open', req)
  File "/usr/local/lib/python3.7/urllib/request.py", line 503, in _call_chain
    result = func(*args)
  File "/usr/local/lib/python3.7/urllib/request.py", line 1362, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "/usr/local/lib/python3.7/urllib/request.py", line 1321, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1076)>

我的证书是最新的

root@8a03fe8175b7:/# pip install --upgrade certifi
Requirement already up-to-date: certifi in /usr/local/lib/python3.7/site-packages (2020.4.5.1)

我也尝试过使用no_ssl_verification solution,但没有帮助。

另外,这个文件是空的,这意味着什么吗?在我的主机上它已满

root@2927b5836cfa:/# ls -alt /etc/ssl/certs/ca-certificates.crt 
-rw-r--r-- 1 root root 0 May 23 20:14 /etc/ssl/certs/ca-certificates.crt

来自容器中的 python shell 的更多信息,我不知道这是否有帮助。但是容器中没有/export目录:

print(ssl.get_default_verify_paths())

DefaultVerifyPaths(cafile=None, capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/export/home/pb2/build/sb_0-35870562-1568195162.53/openssl-1.1.1d-el6-x86-64bit/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/export/home/pb2/build/sb_0-35870562-1568195162.53/openssl-1.1.1d-el6-x86-64bit/ssl/certs')

您能否提供一些解决此问题的想法?

【问题讨论】:

  • 你试过verify=False吗?
  • 我在 docker 容器中运行这些。这一切都适用于主机 Linux 机器 condo Linux 安装。请求的调用没有 verify=False,因为它在包 fredapi 中
  • 我需要在docker机器中自己添加ca证书吗
  • 我可能有一个解决方案;我从这里得到了文件curl.haxx.se/ca/cacert.pem。然后进入 docker 容器并设置环境变量 SSL_CERT_DIR 和 SSL_CERT_FILE 指向该文件的路径和名称。这似乎对python有用。我不知道为什么。证书下载的想法来自stackoverflow.com/questions/39356413/…
  • 可能 Python 默认使用系统的内置根证书,其中一个证书应该能够验证它所访问的 URL,但可能该特定证书已过期或其他原因。当您下载该文件时,您会获得一组更新的根证书,其中可能包括过期证书的更新“版本”,然后设置环境变量告诉 Python 使用更新的证书而不是默认证书一。

标签: python docker https python-requests ssl-certificate


【解决方案1】:

如果您的 docker 容器中没有安装 ca-certificates(即检查 /etc/ssl/certs 目录中是否存在各种证书),请先安装它们。

将以下行添加到 dockerfile 中解决了这个问题。

RUN apt-get update && \
    apt-get install ca-certificates -y && \
    apt-get clean

【讨论】:

    猜你喜欢
    • 2020-04-06
    • 2021-09-17
    • 2020-03-04
    • 2022-11-28
    • 2019-01-17
    • 2021-11-25
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多