ssl.SSLError:[SSL:UNSUPPORTED_PROTOCOL] Docker Python:3.6-slim中不受支持的协议(_ssl.c:852)

时间:2019-12-19 11:17:43

标签: python docker

我正在使用Docker设置我的Python环境。为此,我正在使用python:3.6-slim基本图像。

我现在需要将获取请求发送到仅在Intranet中可用的URL(假设它为https://internal.company.com/API/some_value)。我正在AWS EC2上使用Ubuntu服务器,试图在其中构建该映像。

从该EC2服务器,我可以请求上述URL,但是,当我从Docker容器内部执行上述操作时,出现以下错误。

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 672, in urlopen
    chunked=chunked,
  File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 376, in _make_request
    self._validate_conn(conn)
  File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 994, in _validate_conn
    conn.connect()
  File "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", line 394, in connect
    ssl_context=context,
  File "/usr/local/lib/python3.6/site-packages/urllib3/util/ssl_.py", line 370, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/usr/local/lib/python3.6/ssl.py", line 407, in wrap_socket
    _context=self, _session=session)
  File "/usr/local/lib/python3.6/ssl.py", line 817, in __init__
    self.do_handshake()
  File "/usr/local/lib/python3.6/ssl.py", line 1077, in do_handshake
    self._sslobj.do_handshake()
  File "/usr/local/lib/python3.6/ssl.py", line 689, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:852)

注意:我可以从容器中请求其他https网站。内部URL中使用的SSL协议可能与Internet上使用的网站不同,而且我无从得知。

以下是我的Dockerfile。我是否需要安装其他软件包来支持此操作?

FROM python:3.6-slim
WORKDIR /app
RUN apt-get -y update \
    && apt-get -y upgrade \
    && apt-get install -y poppler-utils \
    && apt-get install -y libsm6 libxext6 libxrender-dev libglib2.0-0

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get install -y postgresql

COPY dlib-19.17.0-cp36-cp36m-linux_x86_64.whl /app/dlib-19.17.0-cp36-cp36m-linux_x86_64.whl
COPY requirements.txt /app/requirements.txt

RUN pip3 install dlib-19.17.0-cp36-cp36m-linux_x86_64.whl \
    && pip3 install -r requirements.txt

COPY . /app

CMD gunicorn -t 300 --workers 5 --bind  0.0.0.0:8080 wsgi

我正在使用请求库发送GET请求

import requests as r

response = r.get('https://internal.company.com/API/some_value')
print(response)

2 个答案:

答案 0 :(得分:1)

您的服务器可能正在公开TLS协议的旧的,不安全的版本,而现代OpenSSL配置为不允许该协议。

https://stackoverflow.com/a/53065682/6214034可能会有帮助。

答案 1 :(得分:1)

请注意在系统范围内设置最低版本,通过自己的HTTPAdapter在脚本中进行设置更安全:

import ssl
ssl_context = ssl.create_default_context()
# Sets up old and insecure TLSv1.
ssl_context.options &= (
    ~getattr(ssl, "OP_NO_TLSv1_3", 0)
    & ~ssl.OP_NO_TLSv1_2
    & ~ssl.OP_NO_TLSv1_1
)
ssl_context.minimum_version = ssl.TLSVersion.TLSv1