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
相关产品推荐
相关产品推荐

