使用自签名证书的双向TLS(Mutual TLS)Python requests请求报错
解决自签名证书双向SSL认证的UNKNOWN_CA错误
首先注意到你生成服务端证书的命令有误,-keyout参数后面少了.key后缀,正确命令应该是:
# server openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out ssl/server.crt -keyout ssl/server.key
你遇到的TLSV1_ALERT_UNKNOWN_CA错误,核心是双向SSL认证环节中,服务端不信任客户端的证书,同时客户端验证服务端证书时也存在信任链问题,以下是具体解决步骤:
1. 服务端配置信任客户端证书
启动Gunicorn时,除了指定服务端的证书和密钥,还需要添加信任的客户端CA证书(因为你的客户端证书是自签名,它本身就具备CA属性,直接指定client.crt即可):
gunicorn --certfile ssl/server.crt --keyfile ssl/server.key --ca-certs ssl/client.crt --ssl-version TLSv1_2 your_app:app
--ca-certs参数的作用是告诉服务端:仅接受由该CA签发的客户端证书。
2. 确保服务端证书的CN与请求域名匹配
生成服务端证书时,Common Name(CN)必须设置为localhost(因为你请求的地址是https://localhost:8080),否则客户端会因域名不匹配拒绝信任服务端证书。如果之前生成时CN设置错误,重新生成服务端证书即可。
3. 客户端请求的验证调整
你的客户端代码中verify="ssl/server.crt"是正确的逻辑(指定信任服务端的自签名证书),但要确保服务端证书的CN为localhost。如果是测试环境想临时跳过服务端证书验证,可以设置verify=False,但生产环境绝对禁止这么做:
import requests response = requests.get( "https://localhost:8080/", verify=False, # 仅测试场景使用 cert=("ssl/client.crt", "ssl/client.key") )
更规范的方案:用根CA签发客户端和服务端证书
自签名证书的信任链逻辑脆弱,更严谨的方式是先生成根CA,再用它签发客户端和服务端证书:
生成根CA
openssl req -new -newkey rsa:4096 -x509 -sha256 -days 3650 -nodes -out ssl/rootCA.crt -keyout ssl/rootCA.key
生成并签发服务端证书
# 生成服务端证书签名请求(CSR) openssl req -new -newkey rsa:4096 -nodes -out ssl/server.csr -keyout ssl/server.key # 用根CA签发服务端证书 openssl x509 -req -in ssl/server.csr -CA ssl/rootCA.crt -CAkey ssl/rootCA.key -CAcreateserial -out ssl/server.crt -days 365 -sha256
生成并签发客户端证书
# 生成客户端证书签名请求(CSR) openssl req -new -newkey rsa:4096 -nodes -out ssl/client.csr -keyout ssl/client.key # 用根CA签发客户端证书 openssl x509 -req -in ssl/client.csr -CA ssl/rootCA.crt -CAkey ssl/rootCA.key -CAcreateserial -out ssl/client.crt -days 365 -sha256
重新配置服务端与客户端
- Gunicorn启动命令:
gunicorn --certfile ssl/server.crt --keyfile ssl/server.key --ca-certs ssl/rootCA.crt --ssl-version TLSv1_2 your_app:app
- 客户端代码:
import requests response = requests.get( "https://localhost:8080/", verify="ssl/rootCA.crt", cert=("ssl/client.crt", "ssl/client.key") )
通过根CA做信任中介,两端的证书信任链会更清晰,彻底解决UNKNOWN_CA错误。
内容的提问来源于stack exchange,提问作者renatodamas
相关产品推荐
相关产品推荐

