ssl.SSLError:[ssl:UNSUPPORTED_PROTOCOL]Docker Python中不受支持的协议(_ssl.c:852):3.6-slim
我正在使用Docker设置Python环境。因此,我使用的是ssl.SSLError:[ssl:UNSUPPORTED_PROTOCOL]Docker Python中不受支持的协议(_ssl.c:852):3.6-slim,python,docker,Python,Docker,我正在使用Docker设置Python环境。因此,我使用的是python:3.6-slimbase图像 我现在需要向一个URL发送一个get请求,该URL只在内部网中可用(假设它是可用的)。我正在AWS EC2上使用Ubuntu服务器,在那里我试图构建这个图像 从那个EC2服务器,我可以请求上面的URL,但是,当我在docker容器中进行同样的操作时,我得到了以下错误 Traceback (most recent call last): File "/usr/local/lib/python
python:3.6-slim
base图像
我现在需要向一个URL发送一个get请求,该URL只在内部网中可用(假设它是可用的)。我正在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)
可能您的服务器正在公开一个旧的、不安全的TLS协议版本,而现代OpenSSLs配置为不允许该版本 也许会有帮助 编辑2021: 让我总结一下你对那些懒于阅读评论的人的评论 您必须在
/etc/ssl/openssl.cnf
要替换该行,您可以将
运行sed-i-E的/MinProtocol[=\]+.*/MinProtocol=TLSv1.0/g'/etc/ssl/openssl.cnf
添加到Dockerfile小心设置系统范围内的最低版本,使用自己的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
这很有帮助,我将容器内
/etc/ssl/openssl.cnf
文件中的条目MinProtocol
从TLSv1.2
更改为TLSv1.0
。您知道我如何通过将此更改自动化吗。Dockerfile?创建该配置文件,然后复制openssl.cnf/etc/ssl/openssl.cnf,例如。@parthapratimnog若要替换该行,可以添加运行sed-i-E的/MinProtocol[=\]+*/MinProtocol=TLSv1.0/g'/etc/ssl/openssl.cnf
到您的Dockerfiler许多Linter报告没有ssl.OP_no_TLSv1_3,所以我将其替换为getattr(ssl,“OP_no_TLSv1_3”,0)
,并更新了答案。