Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ssl.SSLError:[ssl:UNSUPPORTED_PROTOCOL]Docker Python中不受支持的协议(_ssl.c:852):3.6-slim_Python_Docker - Fatal编程技术网

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

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

我正在使用Docker设置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)
,并更新了答案。