我正在使用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)
答案 0 :(得分:1)
您的服务器可能正在公开TLS协议的旧的,不安全的版本,而现代OpenSSL配置为不允许该协议。
答案 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