ssl 模块是 Python 标准库中用于实现 TLS/SSL 加密通信的模块。它为网络连接提供安全层支持,可用于客户端与服务器之间的加密数据传输,广泛应用于 HTTPS、SMTP over SSL、FTPS 等安全协议场景。
常见应用场景:
(1)构建支持 HTTPS 的客户端或服务器。
(2)为现有的 socket 添加 TLS/SSL 支持。
(3)安全地验证服务器或客户端身份。
(4)配置证书、密钥、CA 文件等以确保通信安全。
(5)与 urllib, smtplib, http.client 等库结合使用进行加密连接。
◆ ◆ ◆
核心概念
1、TLS/SSL 协议
安全传输协议,为数据加密、身份验证和完整性保护提供标准。
2、加密套件 (Cipher)
包含加密算法、密钥交换算法、消息认证算法等组成部分。
3、证书
用于身份验证的公钥签名文件,通常使用 .pem 格式。
4、上下文(Context)
一个 SSLContext 对象,用于统一管理证书、密钥、参数等配置。
5、包装 socket
使用 wrap_socket() 或 SSLContext.wrap_socket() 将普通 socket 加密。
◆ ◆ ◆
应用举例
例 1:创建 HTTPS 客户端请求(使用默认上下文)
import sslimport socket
hostname = 'www.python.org'context = ssl.create_default_context()
with socket.create_connection((hostname, 443)) as sock: with context.wrap_socket(sock, server_hostname=hostname) as ssock: print(ssock.version()) # 输出 SSL/TLS 协议版本
例 2:验证服务器证书并读取内容(与 urllib 配合)
import sslimport gzipfrom urllib.request import urlopenfrom io import BytesIO
context = ssl.create_default_context()response = urlopen("https://www.python.org", context=context)
# 将响应内容解压为文本(如果是 gzip 格式)buffer = BytesIO(response.read())with gzip.GzipFile(fileobj=buffer) as f: html = f.read().decode('utf-8')
print(html[:1000]) # 打印前1000个字符
例 3:创建安全服务端 socket(加载证书)
import sslimport socket
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)context.load_cert_chain(certfile="server.crt", keyfile="server.key")
with socket.socket() as sock: sock.bind(('localhost', 8443)) sock.listen(1) with context.wrap_socket(sock, server_side=True) as ssock: conn, addr = ssock.accept() print("连接来自:", addr)
例 4:自定义客户端验证证书(带 CA)
import sslimport socket
context = ssl.create_default_context()context.load_verify_locations(cafile="ca.pem")
with socket.create_connection(('localhost', 8443)) as sock: with context.wrap_socket(sock, server_hostname='localhost') as ssock: print("已验证服务器证书")
例 5:查看系统默认 CA 路径
import ssl
paths = ssl.get_default_verify_paths()print("默认 CA 文件路径:", paths.cafile)print("默认 CA 目录路径:", paths.capath)
◆ ◆ ◆
常用函数速览
ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH)
创建一个带默认安全设置的 SSLContext 对象。
参数:
purpose:用途,默认是 SERVER_AUTH(即验证服务器证书)
返回:SSLContext 实例
ssl.SSLContext(protocol)
手动创建 SSL 上下文对象。
参数:
protocol:使用的协议。如 ssl.PROTOCOL_TLS_CLIENT, ssl.PROTOCOL_TLS_SERVER)
返回:一个上下文对象,可用于进一步配置
SSLContext.load_cert_chain(certfile, keyfile=None)
加载本地证书和私钥,通常用于服务端。
参数:
certfile:证书文件路径(.pem)
keyfile:私钥文件路径(可选)
SSLContext.load_verify_locations(cafile=None, capath=None)
指定 CA 文件或目录,用于验证对方证书。
参数:
cafile:CA 证书路径
capath:包含多个 CA 证书的目录路径
SSLContext.wrap_socket(sock, server_side=False, ...)
将普通 socket 对象包装成支持 SSL 的 socket。
参数:
sock:普通 socket 对象
server_side:是否作为服务器端
返回:SSL socket 对象
ssl.get_default_verify_paths()
返回系统默认的证书路径信息,用于调试。
◆ ◆ ◆
补充说明
1、ssl 模块是 Python 原生支持安全通信的重要工具。
2、通过 SSLContext 对象集中管理证书、密钥、加密套件等。
3、使用简便的 create_default_context() 可快速构建 HTTPS 客户端。
4、搭配 socket 或 http.client, urllib, smtplib 等模块可实现完整的加密通信链路。
5、推荐结合 cryptography 或 certifi 模块进一步提升证书管理能力。
“点赞有美意,赞赏是鼓励”