Python Shell不尊敬翻译吗?

Python Shell不尊敬翻译吗?,python,shell,ssl,Python,Shell,Ssl,我下载了Python 3.4源代码,构建了源代码,并将它们安装在/usr/local中进行测试运行正常 $ ls /usr/local/bin/ | grep python python3 python3.4 python3.4-config python3.4m python3.4m-config python3-config 我有一个小脚本,试图使用SNI。SNI在Python(re:)方面给我带来了麻烦,一个更新版本的Python应该可以解决这个问题。脚本看起来是这样的: #!/usr/

我下载了Python 3.4源代码,构建了源代码,并将它们安装在
/usr/local
中<代码>进行测试运行正常

$ ls /usr/local/bin/ | grep python
python3
python3.4
python3.4-config
python3.4m
python3.4m-config
python3-config
我有一个小脚本,试图使用SNI。SNI在Python(re:)方面给我带来了麻烦,一个更新版本的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\u socket()得到了一个意外的关键字参数“server\u hostname”
错误


编辑:我尝试了卢卡斯在下面的建议,并将行更改为:

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中指定主机名时,如何证明两天的工作是合理的


你知道我这次做错了什么吗?

你在另一个问题中提到的补丁在方法中添加了一个
server\u hostname
参数

但是,您正在调用的函数是,它不接受关键字参数
server\u 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
helper函数,使用
server_hostname
关键字参数对其进行扩展,并将其传递给它返回的
SSLSocket

您在另一个问题中提到的补丁为该方法添加了一个
server_hostname
参数

但是,您正在调用的函数是,它不接受关键字参数
server\u 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
helper函数,使用
server_hostname
关键字参数对其进行扩展,并将其传递给它返回的
SSLSocket

您在另一个问题中提到的补丁为该方法添加了一个
server_hostname
参数

但是,您正在调用的函数是,它不接受关键字参数
server\u 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
helper函数,使用
server_hostname
关键字参数对其进行扩展,并将其传递给它返回的
SSLSocket

您在另一个问题中提到的补丁为该方法添加了一个
server_hostname
参数

但是,您正在调用的函数是,它不接受关键字参数
server\u 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\u socket
helper函数,用
server\u hostname
关键字参数扩展它,并将其传递给它返回的
SSLSocket

谢谢Lukas。因此,我对Python几乎一无所知。我被告知不要使用它,因为它很容易使用。确切地说,我需要做什么才能使python与SNI一起工作?这与python无关,而与SSL有关。不幸的是,我自己对SSL的细节不是很熟悉,所以我无法告诉您如何使用
SSL
模块的API。不过,我强烈建议您查看源代码ssl.wrap_socket`看起来像一个方便的实用程序函数,可能不支持它所能支持的所有选项。您可以尝试复制它的功能,但将
服务器主机名
传递到需要的位置。@noloader-您上一个问题的示例包含使用
SSLSocket
而不是
wrap\u socket
,这应该可以工作-至少如果
为True
。。。你试过了吗?@mata-好的,谢谢。让我试试布鲁诺的例子。上面的例子是基于他们维基上Python的东西。如果有什么能起作用的话,我希望官方的例子能起作用。@noloader,很抱歉我不清楚,但所有这些都是关于我所说的“不幸的是,服务器名称参数不在普通的ssl.wrap\u套接字中,只在SSLContext.wrap\u套接字中,但您可以直接使用SSLSocket”的意思。当我尝试我的代码时,我最初重新定义了一个
包装插座
,但后来我意识到它可能不值得。考虑到直接创建
SSLSocket
或多或少是一回事,它可能是为了实现遗留兼容性。因此,我对Python几乎一无所知。我被告知不要使用它,因为它很容易使用。确切地说,我需要做什么才能使python与SNI一起工作?这与python无关,而与SSL有关。不幸的是,我自己对SSL的细节不是很熟悉,所以我无法告诉您如何使用
SSL
模块的API。不过,我强烈建议您查看源代码ssl.wrap_socket`看起来像一个方便的实用程序函数,可能不支持它所能支持的所有选项。您可以尝试复制它的功能,但将
服务器主机名
传递到需要的位置。@noloader-您上一个问题的示例包含使用
SSLSocket
而不是
wrap\u socket
,这应该可以工作-至少如果
为True
。。。你试过了吗?@mata-好的,谢谢。让我试试布鲁诺的例子。上面的例子是基于他们维基上Python的东西。如果有什么能起作用的话,我希望官方的例子能起作用。@noloader,很抱歉我不清楚,但所有这些都是关于我所说的“不幸的是,服务器名称参数不在普通的ssl.wrap\u套接字中,只在SSLContext.wrap\u套接字中,但您可以直接使用SSLSocket”的意思。当我尝试我的代码时,我最初重新定义了一个
包装插座
,但后来我意识到了这一点