在 python http.client.HTTPSConnection 中设置较新的 ssl 版本
Setting newer ssl version in python http.client.HTTPSConnection
我在尝试向删除服务器发送简单 POST 请求的 https 客户端之后得到了这个。
!/usr/bin/python3
import http.client
import json
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
connection = http.client.HTTPSConnection('192.168.11.1', 444, context = context)
headers = {'Content-type': 'application/json',
'Accept': 'application/json',
'Content-Length': '0'}
foo = {'ver': '111'}
json_foo = json.dumps(foo)
connection.request('POST', '/post', json_foo, headers)
response = connection.getresponse()
print(response.read().decode())
但是,这样做时我得到 [SSL: WRONG_VERSION_NUMBER] wrong version number
所以我尝试手动将 ssl 协议设置为更新版本(通过在创建连接时使用 ssl.SSLContext)。
这是调用堆栈:
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/http/client.py", line 1245, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/http/client.py", line 1291, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/http/client.py", line 1240, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/http/client.py", line 1008, in _send_output
self.send(msg)
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/http/client.py", line 948, in send
self.connect()
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/http/client.py", line 1414, in connect
self.sock = self._context.wrap_socket(self.sock,
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/ssl.py", line 500, in wrap_socket
return self.sslsocket_class._create(
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/ssl.py", line 1040, in _create
self.do_handshake()
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/ssl.py", line 1309, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1108)
然而,在python3中,这是我的选择。不幸的是,协议 2 和 3 不在列表中。
PROTOCOL_SSLv23
PROTOCOL_TLS_SERVER
PROTOCOL_TLSv1_2
PROTOCOL_TLS
PROTOCOL_TLSv1
PROTOCOL_TLS_CLIENT
PROTOCOL_TLSv1_1
知道如何升级 http 连接内套接字的 ssl 版本吗?
我需要升级 ssl 包吗?我认为它在 python3 (3.8.2)
中相对更新
谢谢!
... it worked when i used ... curl ..."http://192.168.11.1:444/post"
您使用 curl 成功执行的是普通 HTTP 请求(http://...
而不是 https://...
)。您在代码中尝试(和失败)的是 HTTPS 请求,即基于 TLS 的 HTTP。该错误消息是尝试对不支持 TLS 的服务器使用 TLS 的结果。
我在尝试向删除服务器发送简单 POST 请求的 https 客户端之后得到了这个。
!/usr/bin/python3
import http.client
import json
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
connection = http.client.HTTPSConnection('192.168.11.1', 444, context = context)
headers = {'Content-type': 'application/json',
'Accept': 'application/json',
'Content-Length': '0'}
foo = {'ver': '111'}
json_foo = json.dumps(foo)
connection.request('POST', '/post', json_foo, headers)
response = connection.getresponse()
print(response.read().decode())
但是,这样做时我得到 [SSL: WRONG_VERSION_NUMBER] wrong version number
所以我尝试手动将 ssl 协议设置为更新版本(通过在创建连接时使用 ssl.SSLContext)。
这是调用堆栈:
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/http/client.py", line 1245, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/http/client.py", line 1291, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/http/client.py", line 1240, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/http/client.py", line 1008, in _send_output
self.send(msg)
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/http/client.py", line 948, in send
self.connect()
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/http/client.py", line 1414, in connect
self.sock = self._context.wrap_socket(self.sock,
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/ssl.py", line 500, in wrap_socket
return self.sslsocket_class._create(
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/ssl.py", line 1040, in _create
self.do_handshake()
File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/ssl.py", line 1309, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1108)
然而,在python3中,这是我的选择。不幸的是,协议 2 和 3 不在列表中。
PROTOCOL_SSLv23
PROTOCOL_TLS_SERVER
PROTOCOL_TLSv1_2
PROTOCOL_TLS
PROTOCOL_TLSv1
PROTOCOL_TLS_CLIENT
PROTOCOL_TLSv1_1
知道如何升级 http 连接内套接字的 ssl 版本吗? 我需要升级 ssl 包吗?我认为它在 python3 (3.8.2)
中相对更新谢谢!
... it worked when i used ... curl ..."http://192.168.11.1:444/post"
您使用 curl 成功执行的是普通 HTTP 请求(http://...
而不是 https://...
)。您在代码中尝试(和失败)的是 HTTPS 请求,即基于 TLS 的 HTTP。该错误消息是尝试对不支持 TLS 的服务器使用 TLS 的结果。