ssl 模块

Python ssl 模块详解 - 为套接字添加 TLS/SSL 支持,证书验证与安全通信

分类: stdlib 难度: 中级 更新: 2024-12-19
SSL TLS 加密 证书 HTTPS

ssl 模块

📝 概述

ssl 模块为 socket 提供 TLS/SSL 加密层,支持证书验证、主机名校验、双向认证等,是实现 HTTPS 与安全通信的基础。

🎯 学习目标

  • 掌握创建安全 SSLContext 的方法
  • 学会将已有 socket 包装为安全连接
  • 正确处理服务器证书验证与主机名匹配
  • 了解自签名证书的测试方式与风险

📋 前置知识

  • 网络编程与 socket 基础
  • HTTPS/SSL/TLS 基本概念
  • 证书、公钥/私钥、CA 的基本知识

🔍 详细内容

创建默认安全上下文

# -*- coding: utf-8 -*-
import ssl

# 推荐:使用系统 CA 与安全默认值
ctx = ssl.create_default_context()
print(ctx.check_hostname)       # True
print(ctx.verify_mode == ssl.CERT_REQUIRED)

包装套接字为 TLS 连接

# -*- coding: utf-8 -*-
import socket, ssl

ctx = ssl.create_default_context()

with socket.create_connection(("www.python.org", 443), timeout=5) as sock:
    with ctx.wrap_socket(sock, server_hostname="www.python.org") as ssock:
        ssock.send(b"GET / HTTP/1.1\r\nHost: www.python.org\r\nConnection: close\r\n\r\n")
        print(ssock.recv(80))

加载自定义 CA 或客户端证书(双向认证)

# -*- coding: utf-8 -*-
import ssl

ctx = ssl.create_default_context(cafile="/path/to/ca.pem")
# 或:ctx.load_verify_locations(cafile="/path/to/ca.pem")

# 客户端证书与私钥
# ctx.load_cert_chain(certfile="/path/to/client.crt", keyfile="/path/to/client.key", password=None)

放宽验证(仅测试用,不推荐)

# -*- coding: utf-8 -*-
import ssl

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

💡 实际应用

1. 与 urllib 协同(自定义上下文)

# -*- coding: utf-8 -*-
from urllib.request import urlopen
import ssl

ctx = ssl.create_default_context()
with urlopen('https://httpbin.org/get', context=ctx, timeout=5) as resp:
    print(resp.status)

2. 与 http.client 协同

# -*- coding: utf-8 -*-
from http.client import HTTPSConnection
import ssl

ctx = ssl.create_default_context()
conn = HTTPSConnection('httpbin.org', context=ctx)
conn.request('GET', '/get')
print(conn.getresponse().status)
conn.close()

⚠️ 注意事项

  • 生产环境务必进行证书验证与主机名校验
  • 切勿在生产中关闭证书验证(CERT_NONE)
  • 妥善保管私钥,避免泄露
  • 注意最低 TLS 版本与加密套件的安全性

🔗 相关内容

📚 扩展阅读

  • 官方文档:https://docs.python.org/3/library/ssl.html
  • Mozilla TLS 指南:https://wiki.mozilla.org/Security/Server_Side_TLS

🏷️ 标签

SSL TLS 加密 证书 HTTPS


最后更新: 2024-12-19
作者: Python教程
版本: 1.0

作者: Python教程

版本: 1.0

讨论与反馈

欢迎在下方留言讨论,分享你的学习心得或提出问题。评论基于GitHub Issues,需要GitHub账号。