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

Ubuntu 20.04下Flask API跨服务SSL请求出现证书验证错误如何解决

自签SSL证书跨服务调用验证失败解决方案

报错的核心原因有两个:一是你生成的自签证书默认没有加入系统根证书信任列表,requests默认不会信任非官方CA签发的证书;二是你生成证书时没有将服务IP写入**Subject Alternative Name(SAN)**字段,现代TLS校验会校验该字段,缺失会直接导致校验失败,哪怕你手动指定了证书路径也无法通过。

1 重新生成符合校验要求的自签证书

首先创建openssl配置文件cert.conf,补全必填的SAN字段:

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
x509_extensions = v3_req

[dn]
C = CN
ST = 你所在省份
L = 你所在城市
O = 你的组织名
OU = 你的部门名
emailAddress = 你的邮箱
CN = 第二个API的IP地址

[v3_req]
subjectAltName = @alt_names
extendedKeyUsage = serverAuth

[alt_names]
IP.1 = 第二个API的IP地址
# 如果两个服务需要互相调用,就把第一个API的IP也加上:
# IP.2 = 第一个API的IP地址

用配置文件生成新的证书和密钥,覆盖旧文件:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/name_of_key.key -out /etc/ssl/name_of_crt.crt -config cert.conf

替换所有Nginx配置里的旧证书后重启Nginx生效:

sudo systemctl restart nginx

2 配置证书信任

有两种方案可选,二选一即可:

方案A:加入系统信任列表(一劳永逸)

将证书加入Ubuntu系统根证书信任库,所有程序默认都会信任该证书:

  • 复制证书到系统证书目录:sudo cp /etc/ssl/name_of_crt.crt /usr/local/share/ca-certificates/
  • 更新系统证书缓存:sudo update-ca-certificates
    配置完成后requests代码里不需要加verify参数,默认就能通过校验。

方案B:代码手动指定证书路径

保持你原有代码的写法,只需要确认两点:

  • 第一个API服务器上/etc/ssl/name_of_crt.crt和第二个API服务配置的证书是同一个文件,你可以直接把第二个API的证书拷贝到第一个服务器的对应路径下
  • 确保运行Flask服务的用户对该证书文件有读权限

可以先用curl命令验证配置是否正确,能正常返回结果再跑Python代码:

curl --cacert /etc/ssl/name_of_crt.crt https://第二个API的IP:57949/second_api

注意事项

如果两个服务需要互相调用,生成证书时要把两个服务的IP都写到配置文件的alt_names字段里,同一个证书可以给两个服务同时使用。

内容的提问来源于stack exchange,提问作者fenderogi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:15:03