我正在尝试使用Python来测试web服务器。我几乎没有使用Python的经验,但我鼓励使用它,因为它很容易学习,而且很容易处理(别人的意见,目前不是我的意见)。我使用的脚本是:
s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s2 = ssl.wrap_socket(s1,
ca_certs="./pki/signing-dss-cert.pem",
cert_reqs=ssl.CERT_REQUIRED,
ssl_version=ssl.PROTOCOL_TLSv1,
server_hostname="localhost")
s2.connect( ("localhost", 8443) )
s2.send("GET / ")
time.sleep(1)
s2.send("HTTP/1.1")
错误是:
Traceback (most recent call last):
File "./fetch.sh", line 10, in <module>
server_hostname="localhost")
TypeError: wrap_socket() got an unexpected keyword argument 'server_hostname'
我也试过毫无乐趣地使用servername
、name
、hostname
和sni
。
Python文档没有提到SNI(TLS/SSL wrapper for socket objects和SSL wiki page)。但我知道SNI和server_hostname
的补丁是4年前在2010年合并的(Add a *server_hostname* argument to ^{
我需要访问的等效OpenSSL调用是SSL_set_tlsext_host_name
。
如何指定SNI主机名?(最终,我需要将其设置为任意名称,因为我正在测试代理)。
首先连接,然后包装插座。
在python2的情况下,我有时也会使用下面的hack(因为
httplib.HTTPSConnection
文档说它不在https服务器证书上执行任何类型的检查):注意,如果您想与服务器通信,那么使用http客户端通常比使用原始套接字要容易得多。
我的env是:requests==2.7.0,python-2.7.5-34.el7.x86_64,gevent==1.0.2
将python版本改为python-2.7.5-18.el7_1.1.x86_64,问题就解决了。
在CentOS上:
pakages可以在谷歌上搜索。
patch you're mentioning是针对Python 3.2的,您使用的是Python 2.7。Issue 5639似乎还表明没有计划支持Python 2.7的SNI端口。
您可以用pyOpenSSL来包装套接字(它的} 。(我不确定Debian7.3附带的是哪个版本,如果需要,您可能需要设置一个virtualenv并在本地升级到一个新版本。)
Connection
类自0.13版以来有一个^{有一个SNI example是pyOpenSSL存储库。
如果您希望使用
wrap_socket
更符合技巧,即在httplib
连接中替换sock
的值,则可以查看urllib3 does this with pyOpenSSL。本质上,它从一个现有的套接字创建一个OpenSSL.SSL.Connection
,但是由于该连接与套接字不兼容,它将其包装成一个实现所需方法的类。(顺便说一下,在Python 2.7中,
urllib
,urllib2
和httpconnection
根本不做任何证书验证,除非您通过包装它们的套接字自己实现它。)编辑:
下面是一个与Python3.2一起工作的代码版本。不幸的是,
server_name
参数不在普通的ssl.wrap_socket
中,只在SSLContext.wrap_socket
中,但是可以直接使用SSLSocket
。相关问题 更多 >
编程相关推荐