我需要我的python TLS客户端只提供版本TLS 1.2(禁用TLS 1.0,TLS 1.1,SSLv3,SSLV2)。
我在Windows 10下使用python 3.6.5和openssl库。根据官方文档here,这两行应该阻止TLS 1.0和TLS 1.1:
ssl.OP_NO_TLSv1
阻止TLSv1连接。此选项仅适用于PROTOCOL_TLS。它阻止了同行的选择 TLSv1作为协议版本。
3.2版中的新功能。
ssl.OP_NO_TLSv1_1
阻止TLSv1.1连接。此选项仅适用于PROTOCOL_TLS。它阻止了同行的选择 TLSv1.1作为协议版本。仅适用于openssl版本 1.0.1 +。
版本3.4中的新功能。
以上的配料说它们只适用于新推出的:
PROTOCL_TLS
但是,实际上,我尝试禁用TLS 1.0和TLS 1.1并测试连接到TLS 1.0(测试服务器支持的唯一版本),我的脚本仍然可以连接到它。
我做错了吗?以上两行语法如何与PROTOCOL_TLS
一起使用?
这是我正在运行的脚本:
import socket, ssl
context = ssl.SSLContext()
context.protocol = ssl.PROTOCOL_TLS
context.protocol = ssl.OP_NO_TLSv1 # prevents TLS 1.0
context.protocol = ssl.OP_NO_TLSv1_1 # prevents TLS 1.1
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#note: the IP below is for private testing server not a public address
sslSocket = context.wrap_socket(s, server_hostname = '192.168.56.7')
sslSocket.connect((domain, 443))
print("connection succeeded")
sslSocket.close()
注意:用于测试实时TLS 1.0服务器,您可以通过搜索或使用此link找到任何TLS 1.0服务器,但我认为他们使用的是443以外的其他端口。 / p>
注意:我没有添加ssl.OP_NO_SSLv2
或ssl.OP_NO_SSLv3
,因为在使用context.protocol = ssl.PROTOCOL_TLS
答案 0 :(得分:1)
documentation for SSLContext明确指出:
SSLContext.protocol
构造上下文时选择的协议版本。此属性为只读。
因此,使用此属性设置协议的任何尝试都将失败。相反,您需要修改SSLContext.options:
{{1}}