You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用自签名证书的双向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:35:22