python - 调用 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
解决方案
由于多种原因,通常会遇到此类错误,其中包括:
重置原因:连接失败如果您收到 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
您可以在此处查看更多文档。
推荐阅读
- html - 可以使用 CSS Flexbox 来拉伸每一行的元素,同时保持一致的宽度吗?
- arrays - 如何初始化大多数值相同但某些值不同的静态数组?
- android - Firebase 数据库。检索嵌套数据
- java - 我未能将 Firebase 集成到我的应用中
- ios - 在 UITableView 下附加/粘贴一个 UIButton
- javascript - 动作属性不适用于 JS 验证表单
- asp.net - asp.net 内容页面无法访问母版页中的 html 文件
- javascript - 摆脱对象数组中的“未定义”
- bash - 监视文件夹更改的脚本,如果修改,则将其中的所有项目复制到另一个文件夹
- android - 在Android中更改按钮背景时如何保持默认点击效果?