企业网络调用Google Vision API出现TLS握手错误怎么解决
问题根因
你遇到的503报错本质是SSL证书验证失败,从调试日志可以看到明确错误:SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED。
- 企业内部代理会对所有HTTPS流量做中间人卸载,用企业自签名根证书替换目标站点的官方证书
- Google Cloud Python官方客户端底层默认走gRPC协议,gRPC不会读取操作系统的受信任根证书库,无法识别企业自签名证书
- Postman等REST客户端默认调用系统根证书库,你已经提前将企业自签名根证书导入系统受信任列表,所以Postman调用正常
解决方案
前置准备
先找企业IT部门获取代理使用的自签名根证书(PEM格式,后缀一般为.crt或.pem),存到本地路径,比如C:\internal_proxy_root_ca.pem
方案1:配置gRPC使用自定义根证书(生产环境推荐)
修改代码,初始化客户端时传入企业自签名根证书创建的SSL凭证:
from __future__ import print_function from google.cloud import vision import os import grpc os.environ['http_proxy'] = "http://internalproxyserver.com:8080" os.environ['https_proxy'] = "http://internalproxyserver.com:8080" os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = r"C:\abc.json" # 读取企业自签名根证书 with open(r"C:\internal_proxy_root_ca.pem", 'rb') as f: root_ca_content = f.read() # 生成自定义SSL凭证 ssl_credentials = grpc.ssl_channel_credentials(root_certificates=root_ca_content) # 初始化客户端时传入SSL凭证 client = vision.ImageAnnotatorClient(credentials=ssl_credentials) content = b'iVBORw0KGgoAAAANSUhEUgAAAGQAAAAZCAYAAADHXotLAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAENElEQVRo3u1ay0u6Sxh+PjWzLI0vxRZWdCEqughGCbWxVu2jG7WIdm3CRYuoP6CoKLpA0CYIg6hNQRTYoqhlBQVBFF1Nu2lmRqBl71n9Bj1mxzodz89zvgcGZuad533Hefzme2eUIyKCgN8GImEJBEEECIIIgggQBBEEYRgcHATHcSFlZGSEjdHpdB+OcTgcYfkfFYPB8GlMjuMgl8tRXFyMnp4ePD4+hp231+vF0NAQysvLoVQqIZfLUVRUhN7eXrhcrn9HEfoBDA8PE4CQMjY2xsbo9foQu0gkIqfTSWazmXie/9DHn0tFRQURUcScrKwsstlsIXO22WxUWFgYlqfRaGh3d5eiDfyUo9PTU0pKSiIAxPM8nZ2dBdl9Ph9NTk6yD9zU1ERutztojFKpZPzNzc2g0tbWFiTIZ5z5+XkyGAwsVmNjYxDH6/VSSUkJs7e0tNDS0hKtrq6SyWQiiURCAEilUpHdbo9NQQIXR6PRfGhfWVlhi9DZ2fkl/vj4OMnlcjIajRFxHh4eSKFQEABKSEig19dXZuvr62Pz6OrqCok1PT0d9MURBAnD/2rMwKfk7u6O9aenpxMAkslk5HA4Qnjv7++Um5tLAEgsFtP19XXUBPnPZllEhJubGwBAQkICeJ4HABwfH8NqtQIAqqurkZqaGsLlOA4NDQ0AAL/fj42NjajNW/JPOPX5fFhfXw/p39/fj4h/e3sLjuOC+mpqarC2thYR/+7uDoODgzg/PwcAtLe3QywWAwBOTk7YuIyMjLA+MjMzWT2QE5OCuFwuGI3GqD4RH4kIAC0tLRgaGmJtj8fD6iqVKqw/tVrN6k9PT7EtyN8Fz/NYXFwM6ktJSfmyH7FYDI7j8PLyAqlUCgBITk5mdofDEZZ7f3/P6gqFIrYF0Wg0bP8OxOrqKmpra/+SHxcXh6qqqm+L+Pz8jJmZGczOzmJmZgZOpxPLy8sAgJycHMa5uLgI6y/Qlp2dHVsHw98xy/L7/ZSfn/9hlqXVagkAxcfHh82y8vLyhCzrM0xNTUEmk6GysjKyOyGRCKWlpaxts9lYvaOjg12d9Pf3h3BnZ2dxdHQEAKirq0NaWtr/+x3y+vqKra2toL6dnR14vV54vd6I/QS+L+x2O3Q6HQDAZDLBbDbj4OAAAwMDuL6+Rn19PaRSKSwWC0ZHR9k2GJgQxMyWNTc3x7aBXyU9PZ0WFhbYmNbWVna1AoAkEgmVlpaS2+0ms9lMKpUqorssvV4fccyJiQlmS05OJovFwmxWq5UKCgrCxlGr1bS9vR31u6wf2bIuLy9xdXUV1Ge1WtkB7NcZ5Pn5mbXf3t6wt7cHn88Hu93+acbz3ZhtbW1obm6GUqmEx+MJSjS0Wi12d3cxMDCAsrIyJCUlITExEYWFheju7sbh4SH0en3UdwdO+JOD8AOVAEEQQRAB38QfQtVPbkCRvTgAAAAASUVORK5CYII=' image = vision.Image(content=content) texts = client.text_detection(image=image).text_annotations for text in texts: print('\n"{}"'.format(text.description))
方案2:临时关闭证书验证(仅测试排查用,生产环境禁止使用)
在代码的环境变量配置段添加以下配置,跳过gRPC的证书验证:
os.environ['GRPC_TLS_SKIP_ALL_SERVER_VERIFICATION'] = '1'
方案3:改用REST接口调用
如果不想处理gRPC的证书配置,可以直接调用Google Vision服务的公开REST接口,逻辑和你用Postman调用完全一致,不会出现证书验证问题。
内容的提问来源于stack exchange,提问作者user3363190
相关产品推荐
相关产品推荐

