使用Python 2.9.10中的Tornado 4.2与SNI的SSLV3_ALERT_握手失败

2024-09-29 23:20:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个问题设置正确的SNI标志使用ssl.ssl上下文在Python2.7.10中,每次握手都会失败,我不知道为什么。在

下面是我如何做到的:

import ssl
import socket

if ssl.HAS_SNI:
    print "SNI is available"
print(ssl.OPENSSL_VERSION)

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.load_cert_chain('cacrt.pem', 'cakey.pem', 'password')

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock = context.wrap_socket(sock, server_hostname='virtServer')
sock.connect(('ip.to.the.server', 443))

http_client = tornado.httpclient.HTTPClient()
http_client.fetch('https://ip.to.the.server/some_url', method='GET',  ssl_options=context)

下面是我得到的输出:

^{pr2}$

我做错了什么导致了这个错误?如何更改代码以解决此问题?在

如有任何建议/帮助,将不胜感激。在

谢谢, 当做, 雅罗


Tags: thetoimportipclienthttpsslserver
2条回答

谢谢斯特芬,你的建议最终使我找到了解决办法。 问题不在于TLS版本或OpenSSL,而是因为我没有指定密码,而且python2.7.10的默认列表中也没有必要的密码(RC4-SHA)。在

context.set_ciphers('RC4-SHA')

另外,我不能将创建的上下文与Tornado一起使用,因为我需要提供一个特定的服务器主机名,这是我所看到的只能在套接字对象上执行的操作:

^{pr2}$

相反,我用了sock.write公司(“…”)和短袜收银机()提出要求,一切都很顺利。在

如果没有服务器的更多信息,很难判断,但我将尝试:

OpenSSL 0.9.8zd 8 Jan 2015

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)

您将协议限制为TLS 1.0。服务器可能需要TLS1.2或TLS1.1或SSL 3.0。请注意,您使用的OpenSSL版本不支持tls1.1+。也可能是服务器没有共享密码。在

尝试与浏览器连接,查看使用的TLS版本和密码。如果这是可行的,但是需要tls1.1+,那么尝试使用curl或wget创建一个连接。如果这是公共URL,请使用SSLLabs检查支持的协议和密码。在

http_client.fetch('https://ip.to.the.server/some_url', method='GET',  ssl_options=context)

如果您真的在这里使用IP地址,服务器不接受该IP地址作为SNI名称也可能是一个问题。如果给定的名称与配置不匹配,某些服务器会导致握手失败,而其他服务器只返回默认证书。除此之外,URL中的主机名必须与证书中的名称匹配,这样证书验证才能成功。在

相关问题 更多 >

    热门问题