通过IP访问Google Translate API失败,如何解决SSL握手错误?
修复SSL握手失败问题
出现SSLV3_ALERT_HANDSHAKE_FAILURE错误的核心原因是Google Translate服务器要求**SNI(Server Name Indication)**支持,且默认的SSL上下文配置不兼容Google的安全协议要求。以下是具体修复步骤:
1. 配置兼容的SSL上下文
创建SSL上下文时,指定支持的TLS版本(优先TLS 1.2/1.3,Google已不再支持旧的SSL协议),并确保启用SNI:
from urllib.request import Request, urlopen import ssl ip = '142.250.1.90' HOST = 'translate.googleapis.com' URL_FORMAT = 'https://{}/translate_a/single?client=gtx&sl=en&tl=fr&q=a' def _build_request(ip): url = URL_FORMAT.format(ip) request = Request(url) request.add_header('Host', HOST) return request # 配置SSL上下文:指定TLS版本,启用SNI context = ssl.create_default_context() context.set_alpn_protocols(['http/1.1']) # 禁用Google不支持的旧协议 context.options |= ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 # 跳过主机名与证书匹配验证(因使用IP访问) context.check_hostname = False # 跳过证书验证(仅用于测试场景,生产环境不建议) context.verify_mode = ssl.CERT_NONE try: response = urlopen(_build_request(ip), timeout=2.5, context=context) print(response.read().decode('utf-8')) response.close() except Exception as e: print(f"错误详情: {e}")
2. 关键修复点说明
- 禁用旧协议:Google服务器已拒绝SSLv3、TLS1.0、TLS1.1的连接,通过
OP_NO_SSLv3等选项强制禁用这些协议。 - 确保SNI支持:显式配置
set_alpn_protocols保证HTTP/1.1协议协商正常,新版本Python的ssl.create_default_context()默认已启用SNI,此配置可进一步确保兼容性。 - 跳过证书验证:直接使用IP访问时,服务器返回的证书域名与IP不匹配,因此需要跳过验证(生产环境建议通过域名访问,避免安全风险)。
3. 额外注意事项
- 你使用的IP
142.250.1.90可能已失效或不在Google Translate的有效IP池内,可通过nslookup translate.googleapis.com获取最新可用IP。 - Google Translate的
gtx客户端接口是非正式未公开接口,随时可能被限制或修改,生产环境建议使用官方的Google Cloud Translation API。
内容的提问来源于stack exchange,提问作者GoodCoder666
相关产品推荐
相关产品推荐

