首页 > 解决方案 > 调用 Google Vision API 时出现 TLS 握手错误

问题描述

我们正在尝试在企业/企业网络中部署代码库。此代码在开放的互联网网络中运行良好,但在企业/企业网络中运行良好

我们收到以下错误 google.api_core.exceptions.ServiceUnavailable: 503 failed to connect to all addresses

我们使用 Python v3.8

注意:来自 Postman 等 REST 客户端的 API 调用在同一公司/企业网络中成功

尝试启用调试,它会引发错误

我们是否遗漏了什么,我没有看到任何端口问题,因为可以从 REST 客户端/邮递员应用程序成功访问相同的 url 和端口并获得正确的响应。

from __future__ import print_function
from google.cloud import vision
import os

os.environ['http_proxy'] = "http://internalproxyserver.com:8080"
os.environ['https_proxy'] = "http://internalproxyserver.com:8080"
# os.environ['GRPC_DNS_RESOLVER'] = 'native'
# os.environ["GRPC_TRACE"] = "api,client_channel_routing,cares_resolver,transport_security,tsi"
# os.environ["GRPC_VERBOSITY"] = "debug"
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = r"C:\abc.json"
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)

client = vision.ImageAnnotatorClient()
texts = client.text_detection(image=image).text_annotations

for text in texts:
    print('\n"{}"'.format(text.description))

调试日志摘录

I1108 20:09:43.273000000 10292 src/core/tsi/ssl_transport_security.cc:223]      HANDSHAKE START -       TLS client start_connect  - !!!!!!
I1108 20:09:43.280000000 10292 src/core/tsi/ssl_transport_security.cc:223]                 LOOP -    TLS client enter_early_data  - !!!!!!
I1108 20:09:43.286000000 10292 src/core/tsi/ssl_transport_security.cc:223]                 LOOP -   TLS client read_server_hello  - !!!!!!
I1108 20:09:43.296000000 10292 src/core/ext/filters/client_channel/http_connect_handshaker.cc:329] Connecting to server vision.googleapis.com:443 via HTTP proxy ipv4:172.17.0.5:8080
I1108 20:09:43.476000000 10292 src/core/lib/surface/completion_queue.cc:977] grpc_completion_queue_next(cq=000001F89F023B40, deadline=gpr_timespec { tv_sec: 1636382383, tv_nsec: 676000000, clock_type: 1 }, reserved=0000000000000000)
I1108 20:09:43.521000000 10292 src/core/tsi/ssl_transport_security.cc:223]                 LOOP - TLS client read_server_certifi  - !!!!!!
I1108 20:09:43.554000000 10292 src/core/tsi/ssl_transport_security.cc:223]                 LOOP - TLS client read_certificate_st  - !!!!!!
I1108 20:09:43.565000000 10292 src/core/tsi/ssl_transport_security.cc:223]                 LOOP - TLS client verify_server_certi  - !!!!!!
E1108 20:09:43.581000000 10292 src/core/tsi/ssl_transport_security.cc:1439] Handshake failed with fatal error SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED.
D1108 20:09:43.594000000 10292 src/core/lib/security/transport/security_handshaker.cc:184] Security handshake failed: {"created":"@1636382383.594000000","description":"Handshake failed","file":"src/core/lib/security/transport/security_handshaker.cc","file_line":307,"tsi_code":10,"tsi_error":"TSI_PROTOCOL_FAILURE"}
I1108 20:09:43.614000000 10292 src/core/ext/filters/client_channel/subchannel.cc:1073] Connect failed: {"created":"@1636382383.594000000","description":"Handshake failed","file":"src/core/lib/security/transport/security_handshaker.cc","file_line":307,"tsi_code":10,"tsi_error":"TSI_PROTOCOL_FAILURE"}
I1108 20:09:43.627000000 10292 src/core/ext/filters/client_channel/client_channel.cc:1070] chand=000001F8A00D86D8: connectivity change for subchannel wrapper 000001F8A03C4C50 subchannel 000001F8A0213AD0; hopping into work_serializer

标签: pythondnsgoogle-cloud-vision

解决方案


由于多种原因,通常会遇到此类错误,其中包括:

  • 重置原因:连接失败如果您收到 HTTP 代码 503 或 gRPC 代码 14 以及消息上游连接错误或在标头之前断开/重置。重置原因:连接失败,这表明 ESPv2 无法访问服务的后端。要进行故障排除,请仔细检查以下项目。

  • 错误代码 502 或 503 App Engine 可能需要几分钟才能成功响应请求。如果您发送请求并返回 HTTP 502、503 或其他一些服务器错误,请稍等片刻,然后重试该请求。

  • 网络配置和任何可能导致握手失败的代理。

  • 防病毒、防火墙或任何其他阻止流量的软件。

  • 正在使用公司证书。

您可以看到更多可能的错误

根据具体情况,您可以检查您的代理并确保允许到 accounts.google.com 的流量/连接进行授权。要使用企业证书,必须附加您的企业证书google-cloud-sdk/lib/third_party/httplib2/cacerts.txt以允许来自 Google 云的连接。

另一种解决方案可能是通过以下方式关闭证书验证:

PYTHONHTTPSVERIFY environment变量设置为 0。例如,运行

export PYTHONHTTPSVERIFY=0
python your_script

或者

PYTHONHTTPSVERIFY=0 python your_script

或者,您可以在执行 https 请求之前将其添加到您的代码中

import os, ssl
if (not os.environ.get('PYTHONHTTPSVERIFY', '') and
getattr(ssl, '_create_unverified_context', None)):
ssl._create_default_https_context = ssl._create_unverified_context

您可以在此处查看更多文档。


推荐阅读