如何在python openssl客户端中防止旧版本的TLS protocl

时间:2018-04-11 01:31:47

标签: python sockets ssl openssl tls1.2

我需要我的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_SSLv2ssl.OP_NO_SSLv3,因为在使用context.protocol = ssl.PROTOCOL_TLS

时默认情况下会停用它们

1 个答案:

答案 0 :(得分:1)

documentation for SSLContext明确指出:

  

SSLContext.protocol
  构造上下文时选择的协议版本。此属性为只读

因此,使用此属性设置协议的任何尝试都将失败。相反,您需要修改SSLContext.options

{{1}}