Pet*_*ter 5 python ssl httplib python-2.7
注意:这个代码在Ubuntu上运行正常,但在mac上运行不正常,而不是在本地更改mac/python设置我正在尝试对代码进行更改,以便它可以在任何地方工作.
import ssl
import httplib
httplib.HTTPConnection(server, port, timeout)
Run Code Online (Sandbox Code Playgroud)
但它会引发错误:
[Errno 1] _ssl.c:503:错误:140770FC:SSL例程:SSL23_GET_SERVER_HELLO:未知协议
现在代码不使用urllib.request而是使用httplib
我想更改代码,因此它将SSLv3作为默认协议,如下所示:
ssl.SSLContext(ssl.PROTOCOL_SSLv3)
Run Code Online (Sandbox Code Playgroud)
我环顾四周,找到了一些链接,但没有任何工作!
注意:该HTTPSConnection构造允许通过一个ssl context
作为自蟒2.7.9参数,该参数应在此情况下使用.
这个答案早于这种变化,因此只适用于过时的python版本.
httplib.HTTPSConnection.connect
只是调用ssl.wrap_socket
打开的套接字来初始化https连接,遗憾的是你不能在python2.7中指定任何参数(python3允许传递SSLContext
).
如果要指定协议版本,则需要修补这两个中的一个:
方法1:补丁httplib.HTTPSConnection.connect
:
import httplib
import socket
import ssl
def connect_patched(self):
"Connect to a host on a given (SSL) port."
sock = socket.create_connection((self.host, self.port),
self.timeout, self.source_address)
if self._tunnel_host:
self.sock = sock
self._tunnel()
self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file,
ssl_version=ssl.PROTOCOL_SSLv3)
httplib.HTTPSConnection.connect = connect_patched
Run Code Online (Sandbox Code Playgroud)
这会更改所有连接的协议版本HTTPSConnection
.
方法2:补丁ssl.wrap_socket
:
import ssl
wrap_socket_orig = ssl.wrap_socket
def wrap_socket_patched(sock, keyfile=None, certfile=None,
server_side=False, cert_reqs=ssl.CERT_NONE,
ssl_version=ssl.PROTOCOL_SSLv3, ca_certs=None,
do_handshake_on_connect=True,
suppress_ragged_eofs=True, ciphers=None):
return wrap_socket_orig(sock, keyfile, certfile, server_side,
cert_reqs, ssl_version, ca_certs,
do_handshake_on_connect,
suppress_ragged_eofs, ciphers)
ssl.wrap_socket = wrap_socket_patched
Run Code Online (Sandbox Code Playgroud)
这会更改所有使用的代码的默认协议版本wrap_socket
,因此也会影响其他库.
编辑:
方法3:因为httplib实际上只wrap_socket
从中访问ssl
,所以你也可以httplib.ssl
用一个提供的类替换wrap_socket
.使用functools.partial
使得写这个非常优雅:
import httplib
import ssl
from functools import partial
class fake_ssl:
wrap_socket = partial(ssl.wrap_socket, ssl_version=ssl.PROTOCOL_SSLv3)
httplib.ssl = fake_ssl
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9874 次 |
最近记录: |