我有一些 C++ 服务器应该加强安全性。为此,我限制了服务器可以处理的密码套件。
如何测试这个?我有很多用 python 编写的测试来验证服务器功能。现在我在 python 尝试使用不应该使用的 sicpher 套件连接到服务器的地方添加测试。
在基本测试中,我想测试以下密码套件在任何配置中都不可用:
forbidden_ciphers = [
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
"TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_RSA_WITH_AES_256_CBC_SHA",
"TLS_RSA_WITH_AES_128_CBC_SHA",
]
forbidden_ciphers_str = ':'.join(forbidden_ciphers)
所以我正在尝试配置上下文以使用这个过时的密码:
def test_connection_with_ciphers(url, ciphers_str: str):
url = urllib.parse.urlparse(url)
context = ssl.create_default_context()
context.set_ciphers(ciphers_str)
...
这会抛出异常,因为默认情况下此密码被 python 禁用。这里是MCVE。如您所见,
ssl.SSLError: ('No cipher can be selected.',)
是从 context.set_ciphers(ciphers_str)
抛出的。
我明白为什么,这是 python 应用程序的合理安全角度,但我正在使用 python 代码进行测试。
我可以克服这个默认限制吗?我可以强制 python ssl 上下文使用这个密码吗?所以我可以验证我的服务器是否会拒绝正确错误的连接?