无法获得新鲜图像中的本地发行者证书

时间:2018-09-20 00:44:41

标签: docker ubuntu openssl

我创建了一个新的Docker映像:

FROM ubuntu:18.04

# Install dependencies
RUN apt-get update
RUN apt-get install -y build-essential g++ curl openssl libssl-dev apache2-utils git libxml2-dev sshfs libbz2-dev libsqlite3-dev tk-dev libffi-dev libreadline-dev libfreetype6-dev libpng-dev

# Install Python
RUN curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
RUN echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile && \
    echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile && \
    echo 'eval "$(pyenv init -)"' >> ~/.bash_profile && \
    echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
RUN source ~/.bash_profile && \
    pyenv install 3.7-dev && \
    pyenv virtualenv 3.7-dev venv && \
    pyenv global venv && \
    pip install -U pip

但是,在容器中运行它之后,由于证书问题,我无法访问任何网站。这在Python(3.6和3.7)和openssl中都在发生:

openssl s_client -connect discordapp.com:443
openssl s_client -connect python.org:443
openssl s_client -connect google.com:443

全部返回相同的错误:Verify return code: 20 (unable to get local issuer certificate)

在Python中,它给了我(当discord.py尝试连接到discordapp.com时:

SSL handshake failed on verifying the certificate
protocol: <asyncio.sslproto.SSLProtocol object at 0x7fd78479c6d8>
transport: <_SelectorSocketTransport fd=6 read=polling write=<idle, bufsize=0>>
Traceback (most recent call last):
  File "/root/.pyenv/versions/3.7-dev/lib/python3.7/asyncio/sslproto.py", line 625, in _on_handshake_complete
    raise handshake_exc
  File "/root/.pyenv/versions/3.7-dev/lib/python3.7/asyncio/sslproto.py", line 189, in feed_ssldata
    self._sslobj.do_handshake()
  File "/root/.pyenv/versions/3.7-dev/lib/python3.7/ssl.py", line 763, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1048)
SSL error in data received

我尝试使用apt-get install ca-certificates更新我的证书,但是命令指出此软件包已经是最新的。

我该如何解决?

1 个答案:

答案 0 :(得分:0)

请尝试。

openssl s_client -connect python.org:443 -verify false -debug

如果要禁用验证,请使用我上面写的命令。

  

-调试是可选的。

我认为这是重复的主题,因为问题不在docker中,而是在OpenSSL控制台语法中。

检查以下内容:OpenSSL unable to get local issuer certificate unless CAfile is explicitly specified

实际上,您必须找到您的 -CApath目录。您的证书在那里。

您也将需要通用CAcert,因此请访问此网站: https://curl.haxx.se/docs/caextract.html

希望这会有所帮助。 祝你好运。