如何在ssl python socket

时间:2018-04-11 11:49:30

标签: python sockets ssl openssl tls1.2

我想使用密码字符串创建自己的密码套件列表。如果我在set_ciphers函数中只放置一个字符串,则以下代码有效。但我想要一个自定义的密码列表。还有其他格式,如:ALL:!COMPLEMENTOFDEFAULT:!eNULL,但这不符合我的需要。我有一个自定义的不同密码列表,我无法使用第二种格式组合。

import socket, ssl
import pprint

context = ssl.create_default_context()

cipher = ['DHE-RSA-AES128-SHA', 'DHE-RSA-AES256-SHA', 'ECDHE-ECDSA-AES128-GCM-SHA256']
context.set_ciphers(cipher)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

domain = 'google.com'

sslSocket = context.wrap_socket(s, server_hostname = domain)

sslSocket.connect((domain, 443))
sslSocket.close()
print('closed')

可以找到here函数set_ciphers

2 个答案:

答案 0 :(得分:0)

我可以通过将密码与:分开来包含多个密码,并将所有密码作为一个字符串发送。

cipher = 'DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-GCM-SHA256'
context.set_ciphers(cipher)

这样,客户端提供所有密码。您可以通过致电context.get_ciphers()来确保这一点,您只会看到使用set_cipher插入的密码。

答案 1 :(得分:0)

即使ssl.SSLContext.get_ciphers()以友好的格式(字典列表)返回密码,反之亦然,事情也不尽相同。

根据[Python 3]: SSLContext.set_ciphers(ciphers)

  

为使用此上下文创建的套接字设置可用密码。它应该是OpenSSL cipher list format中的字符串。

关注[OpenSSL]: CIPHER LIST FORMAT

  

密码列表由由冒号分隔的一个或多个密码字符串组成。逗号或空格也是可接受的分隔符,但通常使用冒号。

因此,应使用' DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-GCM-SHA256' 等字符串