壳牌不尊重翻译?

时间:2014-03-14 19:59:12

标签: python shell ssl

我下载了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中指定主机名)时,有谁能证明两天工作的合理性?

这次我有什么想法?

1 个答案:

答案 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