如何在Python SSL套接字中设置密码组。

6

我想使用密码字符串创建自己的密码套件列表。如果我只在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')

函数 set_ciphers 可以在 这里 找到。

2个回答

7

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

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

通过这种方式,客户端提供了所有密码。您可以通过调用context.get_ciphers()来确认这一点,并且您将只看到使用set_cipher插入的密码。


嗨,set_cipher 应该从客户端调用还是在客户端和服务器两侧都必须调用? - danny

3
即使ssl.SSLContext.get_ciphers以友好的格式(字典列表)返回密码,但反过来就不太一样了。
根据[Python.Docs]: ssl - SSLContext.set_ciphers(ciphers)
设置此上下文创建的套接字可用的密码。它应该是一个字符串,采用OpenSSL密码列表格式
根据[OpenSSL]: CIPHER LIST FORMAT强调是我的):
密码列表由一个或多个以冒号分隔的密码字符串组成。逗号或空格也可以作为分隔符,但通常使用冒号。
因此,应该使用类似于"DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-GCM-SHA256"这样的字符串。
翻译成(你的)代码:
ciphers = ["DHE-RSA-AES128-SHA", "DHE-RSA-AES256-SHA", "ECDHE-ECDSA-AES128-GCM-SHA256"]
ciphers_str = ":".join(ciphers)  # "DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-GCM-SHA256"
context.set_ciphers(ciphers_str)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接