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确保安全性。