使用不安全的 SSL/TLS 版本¶
ID: py/insecure-protocol
Kind: problem
Security severity: 7.5
Severity: warning
Precision: high
Tags:
- security
- external/cwe/cwe-327
Query suites:
- python-code-scanning.qls
- python-security-extended.qls
- python-security-and-quality.qls
使用已损坏或弱的加密协议可能会使连接容易受到攻击者的干扰。
建议¶
确保使用现代的强大协议。所有版本的 SSL 以及 TLS 版本 1.0 和 1.1 都已知容易受到攻击。强烈建议使用 TLS 1.2 或更高版本。
示例¶
以下代码显示了使用 SSL 或 TLS 设置连接的各种方法。由于指定的版本,它们都不安全。
import ssl
import socket
# Using the deprecated ssl.wrap_socket method
ssl.wrap_socket(socket.socket(), ssl_version=ssl.PROTOCOL_SSLv2)
# Using SSLContext
context = ssl.SSLContext(ssl_version=ssl.PROTOCOL_SSLv3)
# Using pyOpenSSL
from pyOpenSSL import SSL
context = SSL.Context(SSL.TLSv1_METHOD)
所有情况都应更新为使用安全的协议,例如 PROTOCOL_TLSv1_2
。
请注意,ssl.wrap_socket
已在 Python 3.7 中弃用。推荐的替代方法是
ssl.SSLContext
- 支持 Python 2.7.9、3.2 及更高版本ssl.create_default_context
- 一个便利函数,支持 Python 3.4 及更高版本。即使使用这些替代方法,也应确保使用安全的协议。以下代码说明了如何使用标志(从 Python 3.2 开始可用)或 `minimum_version` 字段(从 Python 3.7 开始首选)来限制创建连接时接受的协议。
import ssl
# Using flags to restrict the protocol
context = ssl.SSLContext()
context.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1
# Declaring a minimum version to restrict the protocol
context = ssl.create_default_context()
context.minimum_version = ssl.TLSVersion.TLSv1_2
参考资料¶
维基百科: 传输层安全.
Python 3 文档: class ssl.SSLContext.
Python 3 文档: ssl.wrap_socket.
Python 3 文档: 关于上下文创建的说明.
Python 3 文档: 关于安全注意事项的说明.
pyOpenSSL 文档: OpenSSL 的 SSL 特定部分的接口.
常见弱点枚举:CWE-327.