python-3.x - 当我们运行此代码时,我们会看到除上述密码之外的其他密码。我们如何强制仅启用特定密码?
问题描述
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()
解决方案
虽然不清楚您对“我们看到除了提到的密码之外的其他密码”的确切含义是什么密码,但您可能指的是 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_ciphersuites。Python尚不提供此 API 。
推荐阅读
- node.js - 在 NodeJS 中创建一个新的目录文件夹
- websocket - 如何在 Jmeter 中编写 Websocket 采样器请求正文
- ios - 在 Swift 中禁用 UISwitch 时,有什么方法可以不使 UISwitch 变灰/淡出?
- css - 使用 Rmarkdown 制作的海报 CSS 文件:需要字体
- amazon-web-services - 无法访问 AWS Elastic beanstalk EC2 实例
- css - 禁用单个表的 css 样式
- c# - 尝试访问自动完成流时出现 COMException (0x80040102)
- python - 尝试本地运行时出现 SqlAlchemy 问题
- sql - 查询计算每日预算
- java - exoplayer 2.11.* 版本在 android 5.0/5.1(Lollipop) 设备中引发渲染器错误