【发布时间】:2018-05-04 17:04:40
【问题描述】:
请多多包涵。我不是 SSL 加密专家。我只想使用他们的 API 连接到服务器。我做不到。当我按照文档中的说明使用这个 api 时,会出现以下错误:
[Errno 1] _ssl.c:510: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
此 API 似乎托管在某处的 AWS 服务器上,它的支持人员已将我推荐给此 AWS document,并附上他们的服务器使用 TLSv1_2016 的附加信息。我不确定这是否正确,但这是我被告知的。
Ubuntu 14.0.4 (openssl v1.0.1f) 附带的 OpenSSL 不支持此版本的 TLS。支持 1.2 版。我定期升级我的系统,但似乎没有任何批准的 Ubuntu 版本支持此协议。有人建议我升级,但不清楚是什么。
这对我来说都是希腊语。有人能告诉我升级我的系统可以解决这个问题吗?
更新问题在安装了 openssl 1.1.0g 附带的 Ubuntu-18.04 后仍然存在。
【问题讨论】:
-
TLSv1_2016 不是 TLS 版本,但根据该页面,Cloudfront 中的策略 映射到多个 TLS 版本和密码套件,OpenSSL 1.0.1 支持其中的足够多。除了协议版本和密码套件之外,hello 上的 handshake_failure 还可能导致其他原因,这是您的代码还是其他人的封闭库?如果是后者调试会比较难。尝试与
openssl s_client -connect $host:$port连接,如果被拒绝,请尝试添加-servername $host;如果其中任何一个有效,则不是您的 OpenSSL 有问题,而是他们的库。 ... -
... 如果服务器在 443 上可用(并且是公共的,Cloudfront 显然是)但您不能让我们自己寻找,请尝试通过 ssllabs.com/ssltest 进行分析 - 方便测试并有帮助地描述了很多可能的问题。
-
好的,openssl s_client -connect $host:$port -servername $host 工作
-
我认为这一定意味着有一些 openssl 配置允许建立此连接,但这不是用于随机连接尝试的默认配置。也许另一个版本会有所帮助,即使问题也可以通过重新配置服务器来解决,
-
如果
s_client在没有-servername的情况下失败并成功,则服务器需要 SNI 扩展(服务器名称指示)。近年来,许多服务器需要或更喜欢 SNI,它有时是在共享服务器上处理多个域的唯一方法,就像 CloudFront 这样的 CDN 必须的那样。 OpenSSL(至少回到 0.9.8)可以发送 SNI,但前提是调用 OpenSSL 的代码指定了它;你还没有说那是你的代码还是“他们的”。如果“他们的”并关闭,请查看是否有更新版本或任何相关的配置选项。 ...
标签: amazon-web-services ssl openssl ubuntu-14.04