当前位置:首页 > 行业动态 > 正文

httpspythonssl证书

Python的ssl模块支持SSL证书生成、验证及加密通信,可确保网络数据传输安全性

Python处理SSL证书详解

SSL证书基础概念

SSL证书用于验证服务器身份并加密通信,Python通过ssl模块或第三方库(如requests)处理证书验证,核心操作包括:

  • 验证证书:检查证书有效性、签发机构、过期时间等。
  • 忽略验证:跳过证书校验(不推荐生产环境)。
  • 指定CA证书:加载自定义信任根证书。

使用requests库处理SSL证书

requests库默认验证SSL证书,可通过参数调整行为。

验证服务器证书(默认行为)

import requests
response = requests.get("https://example.com")
print(response.content)

默认依赖certifi库的CA证书,自动验证服务器证书。

禁用证书验证(风险操作)

response = requests.get("https://example.com", verify=False)

verify=False会跳过所有证书验证,易受中间人攻击。

使用自定义CA证书

response = requests.get("https://example.com", verify="/path/to/ca_bundle.pem")

指定包含可信CA的PEM格式文件,覆盖默认certifi


使用urllib库处理SSL证书

urllib需配合ssl模块自定义上下文。

创建默认SSL上下文(验证证书)

import urllib.request, ssl
context = ssl.create_default_context()
with urllib.request.urlopen("https://example.com", context=context) as f:
    html = f.read()

禁用证书验证

context = ssl._create_unverified_context()
with urllib.request.urlopen("https://example.com", context=context) as f:
    html = f.read()

_create_unverified_context跳过验证,存在安全风险。

加载自定义CA证书

context = ssl.create_default_context(cafile="/path/to/ca.pem")
with urllib.request.urlopen("https://example.com", context=context) as f:
    html = f.read()

使用ssl模块直接操作

适用于需要精细控制SSL行为的场景。

验证服务器证书

import ssl, socket
context = ssl.create_default_context()
with socket.create_connection(("example.com", 443)) as sock:
    with context.wrap_socket(sock, server_hostname="example.com") as ssock:
        ssock.send(b"GET / HTTP/1.1
Host: example.com
")
        print(ssock.recv(4096))

强制指定CA证书

context = ssl.SSLContext(ssl.PROTOCOL_TLS)
context.load_verify_locations("/path/to/ca.pem")
# 后续操作同上

常见场景对比表

需求 requests解决方案 urllib解决方案 ssl模块方案
默认验证证书 verify=True(默认) ssl.create_default_context() ssl.create_default_context()
禁用验证 verify=False ssl._create_unverified_context() SSLContext.check_hostname=False
指定自定义CA证书 verify="/path/to/ca.pem" ssl.create_default_context(cafile="...") SSLContext.load_verify_locations()

问题与解答

Q1: 如何更新requests库的默认CA证书?

A1:
requests依赖certifi库的CA证书,更新方法:

pip install --upgrade certifi

或手动下载最新cacert.pem(https://github.com/certifi/python-certifi)并替换。


Q2: 如何处理自签名证书的服务器?

A2:
需将自签名证书添加到客户端信任链:

  1. 临时方案:在代码中禁用验证(不推荐):
    requests.get("https://self-signed.com", verify=False)
  2. 安全方案:将自签名证书导入系统信任库或指定为CA文件:
    requests.get("https://self-signed.com", verify="/path/to/self_signed.pem")
0