Cloud Run部署的Python服务发起外部请求遇SSL错误求助
问题总结
部署在Cloud Run的Python Web服务调用外部API(如Google Maps API)时触发SSL错误,错误信息如下:
requests.exceptions.SSLError: HTTPSConnectionPool(host='plus.codes', port=443): Max retries exceeded with url: /api?address=78G9%2B2Q%2C%20Orem%2C%20UT%2C%20USA&key=xxxxxxxx (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1007)')))
本地Docker容器运行正常,已尝试开放所有出站Ingress/Egress规则但无效,怀疑和Cloud Run的TLS配置相关。
解决方案
1. 强制指定TLS版本
Cloud Run运行环境对TLS版本可能有要求,部分外部API仅支持TLS 1.2及以上版本,可通过自定义适配器强制requests使用指定TLS版本:
import requests from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager import ssl class TLSAdapter(HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, ssl_version=ssl.PROTOCOL_TLSv1_2 ) # 创建会话并挂载适配器 session = requests.Session() session.mount('https://', TLSAdapter()) # 使用该会话发起请求 response = session.get("你的外部API地址")
2. 更新容器内CA根证书
容器镜像可能缺少最新的CA证书,导致无法验证外部API的SSL证书。在Dockerfile中添加更新步骤:
- 若使用Debian/Ubuntu镜像:
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && update-ca-certificates
- 若使用Alpine镜像:
RUN apk add --no-cache ca-certificates && update-ca-certificates
3. 排查VPC连接器配置(若使用)
如果你的Cloud Run服务配置了VPC连接器,需确认VPC的防火墙规则允许出站443端口访问公网。未使用VPC连接器的话,Cloud Run默认允许所有出站流量,无需额外配置。
4. 澄清Cloud Run TLS文档的误解
你提到的文档是针对入站请求的:Cloud Run会自动处理外部到服务的TLS终止,你的服务只需监听HTTP端口(如8080)即可,无需在容器内配置HTTPS。这和你发起出站请求的TLS问题无关,出站调用外部API必须使用HTTPS。
内容的提问来源于stack exchange,提问作者wizmer

