python-3.x - 如何在 Python 3.8 中使用 TLS 1.0?
问题描述
jira
我有一个使用模块与 Jira 连接的代码。
不幸的是,Jira 服务器只支持SSLv3
和TLS1
.
我知道它们是旧协议,主机将在今年年底之前接受新协议。
但在此之前,我需要我的 python 代码使用TLS1
.
使用 Python 3.6 它工作正常,但使用 Python 3.8 它不起作用,它向我显示下面的错误消息。
Python 3.8.2 (default, Apr 27 2020, 15:53:34)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from jira import JIRA
>>> import urllib3
>>> urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
>>>
>>> options = {"server": "https://jira.mycompany.com/", "verify": False}
>>> jira = JIRA(options, auth=("user", "pass"))
WARNING:root:HTTPSConnectionPool(host='jira.mycompany.com', port=443): Max retries exceeded with url: /rest/auth/1/session (Caused by SSLError(SSLError(1, '[SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:1108)'))) while doing POST https://jira.mycompany.com/rest/auth/1/session [{'data': '{"username": "user", "password": "pass"}', 'headers': {'User-Agent': 'python-requests/2.23.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/json,*.*;q=0.9', 'Connection': 'keep-alive', 'Cache-Control': 'no-cache', 'Content-Type': 'application/json', 'X-Atlassian-Token': 'no-check'}}]
WARNING:root:Got ConnectionError [HTTPSConnectionPool(host='jira.mycompany.com', port=443): Max retries exceeded with url: /rest/auth/1/session (Caused by SSLError(SSLError(1, '[SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:1108)')))] errno:None on POST https://jira.mycompany.com/rest/auth/1/session
{'response': None, 'request': <PreparedRequest [POST]>}\{'response': None, 'request': <PreparedRequest [POST]>}
WARNING:root:Got recoverable error from POST https://jira.mycompany.com/rest/auth/1/session, will retry [1/3] in 7.597192960254091s. Err: HTTPSConnectionPool(host='jira.mycompany.com', port=443): Max retries exceeded with url: /rest/auth/1/session (Caused by SSLError(SSLError(1, '[SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:1108)')))
我已经检查过并且 OpenSSL 支持TLS1
.
$ openssl s_client -help 2>&1 > /dev/null | egrep "\-(ssl|tls)[^a-z]"
-ssl_config val Use specified configuration file
-tls1 Just use TLSv1
-tls1_1 Just use TLSv1.1
-tls1_2 Just use TLSv1.2
-tls1_3 Just use TLSv1.3
-ssl_client_engine val Specify engine to be used for client certificate operations
仅使用requests
它会给我相同的结果。
python3 -c "import requests; requests.get('https://jira.mycompany.com/')"
Traceback (most recent call last):
File "/home/lazize/repos/myproj/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", line 670, in urlopen
httplib_response = self._make_request(
File "/home/lazize/repos/myproj/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", line 381, in _make_request
self._validate_conn(conn)
File "/home/lazize/repos/myproj/venv/lib/python3.8/site-packages/urllib3/connectionpool.py", line 976, in _validate_conn
conn.connect()
File "/home/lazize/repos/myproj/venv/lib/python3.8/site-packages/urllib3/connection.py", line 361, in connect
self.sock = ssl_wrap_socket(
File "/home/lazize/repos/myproj/venv/lib/python3.8/site-packages/urllib3/util/ssl_.py", line 377, in ssl_wrap_socket
return context.wrap_socket(sock, server_hostname=server_hostname)
File "/usr/lib/python3.8/ssl.py", line 500, in wrap_socket
return self.sslsocket_class._create(
File "/usr/lib/python3.8/ssl.py", line 1040, in _create
self.do_handshake()
File "/usr/lib/python3.8/ssl.py", line 1309, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:1108)
如何将 Python 3.8 与 一起使用TLS1
?
解决方案
我解决了下面安装python包的问题。
这样就安装好了pyOpenSSL
。
让我引用文档:
如果您安装 urllib3 和
secure
额外的,将安装证书验证所需的所有包。
pip install urllib3[secure]
如果我理解正确的 Python 带有自己的SSL
via module实现ssl
。
以这种方式安装urllib3
将强制 PythonOpenSSL
通过pyOpenSSL
.
推荐阅读
- r - R使用嵌套的for循环和矩阵
- bounding-box - python-opencv用像素值绘制边界框
- reactjs - 为什么引导颜色类不能与 React 一起使用?
- asp.net-core - 在 ASP.NET Core 中从同一操作中的“application/json”或“application/x-www-form-urlencoded”请求正文中绑定模型
- java - Android:从 Assets/Raw 目录复制文件。到内部存储
- amazon-web-services - AWS Transcribe 保存到 Amazon S3 存储桶中的文件夹
- python - pyqt5 mediaplayer 如果视频结束了如何获取?
- c++ - 跳过不兼容/找不到 -lsfml-graphics
- java - Apache骆驼豆状态丢失
- c# - 如何在 Android 中使用图标更改 xamarin.forms.maps 标记