我尝试通过 wget 下载图像,但出现错误:无法建立 SSL 连接。
wget https://www.website.com/image.jpg
--2015-02-26 01:30:17-- https://www.website.com/image.jpg
Resolving www.website.com (www.website.com)... xx.xxx.xx.xx
Connecting to www.website.com (www.website.com)|xx.xxx.xx.xx|:443... connected.
Unable to establish SSL connection.
我的测试用例:
- 使用 Ubuntu 12.04.4 LTS(GNU/Linux 3.8.0-44-generic x86_64),基于 linux-gnu 构建的 GNU Wget 1.13.4,我能够使用上面的代码下载图像。没有错误。
- 使用 Ubuntu 14.04 LTS(GNU/Linux 3.13.0-24-generic x86_64),基于 linux-gnu 构建的 GNU Wget 1.15,我无法使用上面的代码下载图像。
另一个变量是 www.website.com 使用 TLS 1.0。我不知道这会如何影响 wget。但是,如果我从 TLS 1.2 网站获取图像,我不会从两个测试用例中得到任何 ssl 连接错误。
Ubuntu 14.04 或 wget 1.15 是否与 TLS 1.0 网站不兼容?我是否需要安装/下载任何库/软件才能启用此连接?
原文由 xanderlopez 发布,翻译遵循 CC BY-SA 4.0 许可协议
然后我猜它是与 TLS1.2 不兼容的站点之一。 12.04 中使用的 openssl 在客户端不使用 TLS1.2,而在 14.04 中它使用 TLS1.2,这可能解释了差异。要解决此问题,请尝试明确使用
--secure-protocol=TLSv1
。如果这没有帮助,请检查您是否可以使用openssl s_client -connect ...
(可能不是)和openssl s_client -tls1 -no_tls1_1, -no_tls1_2 ...
访问该站点。请注意,这可能是其他原因,但这是最可能的原因,并且无法访问该站点,无论如何,一切都只是猜测。
详细假设的问题:通常客户端使用最兼容的握手来访问服务器。这是与旧 SSL 版本兼容的 SSLv23 握手,但会宣布客户端支持的最佳 TLS 版本,以便服务器可以选择最佳版本。在这种情况下,wget 将宣布 TLS1.2。但是有一些损坏的服务器从来没有想过有一天会出现像 TLS1.2 这样的东西,如果客户端宣布支持这个热门的新版本(从 2008 年开始!),它们会拒绝握手,而不是只响应服务器的最佳版本支持。要访问这些损坏的服务器,客户端必须撒谎并声称它只支持 TLS1.0 作为最佳版本。
问题是服务器,而不是客户端。大多数浏览器通过使用较低版本重试来解决这些损坏的服务器。如果第一次连接尝试失败,大多数其他应用程序将永久失败,即它们不会自行降级,并且必须通过某些应用程序特定设置强制执行另一个版本。