文档中心
PythonSSL璇佷功浣跨敤鎸囧崡鎵嬫妸鎵嬫暀浣犲姞瀵嗙綉缁滈€氫俊
时间 : 2025-09-27 16:30:16浏览量 : 1
什么是SSL证书?

SSL证书就像是网络世界的"身份证"和"加密信封"。想象一下你要给朋友寄一封重要信件:SSL证书不仅证明了你确实是网站的主人(就像信封上的官方印章),还能把信件内容变成只有收件人能读懂的密码(加密功能)。
在Python中使用SSL证书,主要涉及两种常见场景:
1. 让你的Python服务端程序能够提供HTTPS服务
2. 让你的Python客户端程序能够安全地访问HTTPS网站
Python服务端SSL配置
基本示例:创建一个HTTPS服务器
```python
import http.server
import ssl
创建一个简单的HTTP请求处理器
handler = http.server.SimpleHTTPRequestHandler
设置服务器参数
server_address = ('0.0.0.0', 443)
HTTPS默认端口是443
httpd = http.server.HTTPServer(server_address, handler)
加载SSL证书和私钥
httpd.socket = ssl.wrap_socket(
httpd.socket,
server_side=True,
certfile="server.crt",
证书文件路径
keyfile="server.key",
私钥文件路径
ssl_version=ssl.PROTOCOL_TLS
)
print("HTTPS服务器已启动...")
httpd.serve_forever()
```
关键点解释:
1. `certfile`:这是你的SSL证书文件,通常由CA(证书颁发机构)签发,包含你的域名/公钥等信息。
2. `keyfile`:这是与证书配对的私钥文件,必须妥善保管。如果私钥泄露,攻击者可以冒充你的服务器。
3. `ssl_version`:指定使用的SSL/TLS协议版本。现代应用应该使用TLSv1.2或更高版本。
实际案例:电商网站的支付接口
假设你正在开发一个电商网站的支付接口:
payment_server.py
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/process_payment', methods=['POST'])
def process_payment():
这里处理支付逻辑...
return jsonify({"status": "success"})
if __name__ == '__main__':
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.load_cert_chain('payment_cert.pem', 'payment_key.pem')
TLS配置增强安全性
context.set_ciphers('ECDHE-RSA-AES256-GCM-SHA384')
app.run(host='0.0.0.0', port=443, ssl_context=context)
安全要点:
- 使用了TLSv1.2协议(避免旧版协议的安全漏洞)
- 指定了强密码套件(防止弱加密算法被利用)
- HTTP严格传输安全(HSTS)也应该在实际部署中考虑
Python客户端SSL验证
基本请求示例
import requests
response = requests.get('https://example.com/api/data')
print(response.text)
这个简单请求已经自动处理了基本的SSL验证。但在企业级应用中,我们通常需要更严格的验证。
SSL验证的四个级别
1. 不验证(危险!仅用于测试)
```python
requests.get('https://example.com', verify=False)
```
2. 系统默认CA验证
requests.get('https://example.com')
3. 自定义CA包验证
requests.get('https://example.com', verify='/path/to/custom/cacert.pem')
4. 双向认证(mTLS)
requests.get('https://example.com',
cert=('/path/client.crt', '/path/client.key'),
verify='/path/to/ca.crt')
Web爬虫实战案例
假设你需要爬取一个银行网站的数据:
from bs4 import BeautifulSoup
配置自定义CA和客户端证书(如果有)
session = requests.Session()
session.cert = ('client.crt', 'client.key') if use_client_auth else None
session.verify = 'bank_ca.pem'
try:
response = session.get('https://onlinebank.example.com/accounts')
SSL握手成功的额外检查点...
if response.ok and response.url.startswith('https'):
soup = BeautifulSoup(response.text, 'html.parser')
...解析数据
except requests.exceptions.SSLError as e:
print(f"SSL错误发生: {e}")
except Exception as e:
print(f"其他错误: {e}")
安全专家建议:
- 不要禁用验证(verify=False),这会让中间人攻击成为可能。
- 定期更新CA包,因为CA可能会吊销某些根证书。
- 检查证书指纹作为额外保护层:
```python
def check_cert_fingerprint(url, expected_fingerprint):
import hashlib
cert_hash = hashlib.sha256(ssl.get_server_certificate((url,443)).encode()).hexdigest()
if cert_hash != expected_fingerprint:
raise ValueError("证书指纹不匹配!可能存在中间人攻击")
SSL/TLS最佳实践清单
1?? 协议版本选择
- ?避免使用: SSLv2、SSLv3、TLSv1、TLSv1.1(已知漏洞)
- ?推荐使用: TLSv1.2或TLSv1.3
2?? 密码套件配置
好的配置示例:
context.set_ciphers('ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384')
3?? 密钥管理
- RSA密钥至少2048位(3072位更佳)
- ECDSA密钥至少256位
4?? OCSP装订(提高性能和安全)
context.post_handshake_auth = True
context.stapling_reqs_filename = 'ocsp_request'
5?? HSTS头强制HTTPS
response.headers['Strict-Transport-Security'] = 'max-age=63072000; includeSubDomains; preload'
FAQ常见问题解答
Q:为什么我的Python程序报错`[SSL: CERTIFICATE_VERIFY_FAILED]`?
A:可能原因有:
①系统缺少根CA包 → `pip install certifi`
②服务器使用了自签名证书 →需手动指定CA文件或添加信任
Q:如何生成自签名证书用于开发测试?
A:
openssl req -x509 -newkey rsa:4096 -nodes -out server.crt -keyout server.key -days 365 \
-subj "/CN=localhost"
注意生产环境必须使用正规CA签发的证书!
Q:Python哪个版本开始支持TLSv1.3?
A:Python3+原生支持,但需要OpenSSL>=1+的支持。可用以下代码检查:
>>> import ssl; print(ssl.HAS_TLSv1_3)
True/False
通过以上详细的讲解和丰富的代码示例,你应该已经掌握了在Python中使用SSL/TLS保护网络通信的核心方法。记住在实际应用中要结合具体业务场景选择适当的安全级别配置!
TAG:python怎么使用ssl证书,python中的ssl模块不可用,pythonssl证书验证错误,python ssl证书,python ssl certificate