Python中配置SSL证书主要分客户端和服务端两种情况。客户端需要验证服务器证书时,设置verify参数;服务端需要指定证书和私钥文件。如果是自签名证书,客户端需要手动信任,或者安装证书到系统信任库。双向认证的话,客户端还要提供自己的证书。下面我说一下详细步骤和示例:
1. 生成SSL证书(自签名示例)
使用OpenSSL生成自签名证书和私钥:
bash
复制
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
生成cert.pem(证书)和key.pem(私钥)。
2. 服务端配置
使用Flask运行HTTPS服务
python
复制
from flask import Flask
app
= Flask(__name__)
@app.route('/')
def home():
return "Hello, HTTPS!"
if __name__ == '__main__':
app
.run(ssl_context=('cert.pem', 'key.pem'), host='0.0.0.0', port=443)
使用标准库http.server
python
复制
import http.server
import ssl
server_address
= ('0.0.0.0', 443)
httpd
= http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
httpd
socket = ssl.wrap_socket(
httpd
socket,
server_side
=True,
certfile
='cert.pem',
keyfile
='key.pem',
ssl_version
=ssl.PROTOCOL_TLS
)
httpd
.serve_forever()
3. 客户端配置
使用requests库验证服务器证书
信任系统CA证书(默认):
python
复制
import requests
response
= requests.get('https://example.com', verify=True) # verify默认为True
使用自签名证书:
python
复制
response = requests.get('https://example.com', verify='cert.pem')
禁用验证(不推荐,仅测试用):
python
复制
response = requests.get('https://example.com', verify=False)
客户端双向认证(需提供客户端证书)
python
复制
response = requests.get(
'https://example.com',
cert
=('client_cert.pem', 'client_key.pem'),
verify
='ca_cert.pem' # 服务器的CA证书
)
4. 使用http.client自定义SSL上下文
python
复制
import ssl
from http.client import HTTPSConnection
创建SSL上下文并加载CA证书
context
= ssl.create_default_context(cafile='ca_cert.pem')
客户端证书双向认证
context
load_cert_chain(certfile='client_cert.pem', keyfile='client_key.pem')
conn
= HTTPSConnection('example.com', context=context)
conn
request('GET', '/')
response
= conn.getresponse()
print(response.read())
5. 处理常见错误
证书验证失败(CERTIFICATE_VERIFY_FAILED):检查证书路径是否正确,或更新CA证书。
证书格式错误:确保文件为PEM格式,而非DER。
权限问题:确认私钥文件(如key.pem)有适当读取权限。
以上步骤就Python中是配置SSL证书的过程,下面总结一下就是:
服务端:需加载证书和私钥,通过ssl_context或wrap_socket启用HTTPS。
客户端: 单向认证,用verify参数指定CA证书路径。 双向认证,额外通过cert参数提供客户端证书和私钥。
安全提示:生产环境避免自签名证书,使用受信任CA颁发的证书,并保持verify=True确保安全性。