我下载了Python 3.4源代码,构建了源代码,并将它们安装在/usr/local
中。 make test
运行得很好。
$ ls /usr/local/bin/ | grep python
python3
python3.4
python3.4-config
python3.4m
python3.4m-config
python3-config
我有一个尝试使用SNI的小脚本。 SNI一直在给我麻烦(re:wrap_socket() got an unexpected keyword argument 'server_hostname'?),而新版本的Python应该可以修复它。脚本如下所示:
#!/usr/local/bin/python3
import sys, ssl, socket
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")
s2.send("\r\n")
time.sleep(1)
s2.send("Hostname: localhost")
s2.send("\r\n")
s2.send("\r\n")
当我尝试运行它时,我仍然收到该死的TypeError: wrap_socket() got an unexpected keyword argument 'server_hostname'
错误。
编辑:我在下面尝试了Lukas的建议并将行改为:
s2 = ssl.SSLContext.wrap_socket(s1,
ca_certs="./pki/signing-dss-cert.pem",
cert_reqs=ssl.CERT_REQUIRED,
ssl_version=ssl.PROTOCOL_TLSv1,
server_hostname="localhost")
现在,当我运行脚本时,我的鼠标指针(向左倾斜的箭头)变成了十字线(加号),我可以在屏幕上拖动框。大约一分钟后,我收到以下错误:
$ ./fetch.sh
./fetch.sh: line 5: syntax error near unexpected token `('
./fetch.sh: line 5: `s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)'
在上面的失败并且指针恢复正常后,我实际上只有一个屏幕截图的图像,我在屏幕上绘制了这些框。
我开始认为Python是一个主要的痛苦,浪费时间。在尝试做一些简单的事情(如在SSL中指定主机名)时,有谁能证明两天工作的合理性?
这次我有什么想法?
答案 0 :(得分:3)
您在另一个问题中提到的补丁会为方法ssl.SSLContext.wrap_socket
添加server_hostname
参数。
您正在调用的函数是ssl.wrap_socket
,但不接受关键字参数server_hostname
。
修改:试试这个:
from ssl import CERT_NONE
from ssl import PROTOCOL_SSLv23
from ssl import SSLSocket
import ssl, socket
import time
s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def wrap_socket_with_sni(sock, keyfile=None, certfile=None,
server_side=False, cert_reqs=CERT_NONE,
ssl_version=PROTOCOL_SSLv23, ca_certs=None,
do_handshake_on_connect=True,
suppress_ragged_eofs=True,
ciphers=None,
server_hostname=None):
return SSLSocket(sock=sock, keyfile=keyfile, certfile=certfile,
server_side=server_side, cert_reqs=cert_reqs,
ssl_version=ssl_version, ca_certs=ca_certs,
do_handshake_on_connect=do_handshake_on_connect,
suppress_ragged_eofs=suppress_ragged_eofs,
ciphers=ciphers, server_hostname=server_hostname)
s2 = wrap_socket_with_sni(s1,
ca_certs="./pki/signing-dss-cert.pem",
cert_reqs=ssl.CERT_REQUIRED,
ssl_version=ssl.PROTOCOL_TLSv1,
server_hostname="localhost")
# ...
我所做的就是复制wrap_socket
辅助函数,用server_hostname
关键字参数扩展它,并将其传递给它返回的SSLSocket
。