首页 > 解决方案 > 当我们运行此代码时,我们会看到除上述密码之外的其他密码。我们如何强制仅启用特定密码?

问题描述

pprint.pprint(context.get_ciphers()) 也打印额外的密码。我们如何强制使用密码和扩展?

import socket, ssl
import pprint
import ssl
context = ssl.create_default_context()
CIPHERS ="ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305-SHA256:ECDHE-RSA-AES128-CBC-SHA:ECDHE-ECDSA-AES128-CBC-SHA:ECDHE-RSA-AES256-CBC-SHA:ECDHE-ECDSA-AES256-CBC-SHA:RSA-AES128-GCM-SHA256:RSA-AES256-GCM-SHA384:RSA-AES128-CBC-SHA:RSA-AES256-CBC-SHA:ECDHE-RSA-3DES-EDE-CBC-SHA:RSA-3DES-EDE-CBC-SHA:AES128-GCM-SHA256:CHACHA20-POLY1305-SHA256:AES:256-GCM-SHA384"
context.set_ciphers(CIPHERS)
pprint.pprint(context.get_ciphers())
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
domain = 'google.com'
sslSocket = context.wrap_socket(s, server_hostname = domain)
sslSocket.connect((domain, 443))
#context.options |= ssl.OP_NO_SSLv2
#context.options |= ssl.OP_NO_SSLv3
print(sslSocket.cipher())
print(sslSocket.version())
print(ssl.OPENSSL_VERSION)
sslSocket.close()

标签: python-3.xssl

解决方案


虽然不清楚您对“我们看到除了提到的密码之外的其他密码”的确切含义是什么密码,但您可能指的是 TLS 1.3 密码,例如TLS_AES_128_GCM_SHA256. 从set_ciphers 的文档中

OpenSSL 1.1.1 默认启用 TLS 1.3 密码套件。无法使用 set_ciphers() 禁用套件。

如果要禁用 TLS 1.3 密码,则必须禁用 TLS 1.3:

context.options |= ssl.OP_NO_TLSv1_3

请注意,这实际上并没有从输出中删除密码,get_ciphers而是使这些密码无法使用。要实际设置这些密码,需要调用 OpenSSL API SSL_CTX_set_ciphersuitesPython尚不提供此 API 。


推荐阅读