Ubuntu 14.04 LTS 上的 wget 无法建立 SSL 连接

Unable to establish SSL connection upon wget on Ubuntu 14.04 LTS

我尝试通过 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.

我的测试用例:

  1. 使用 Ubuntu 12.04.4 LTS(GNU/Linux 3.8.0-44-generic x86_64),GNU Wget 1.13.4 基于 linux-gnu,我能够下载图像 使用上面的代码。没有错误。
  2. 使用 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 连接错误。

Ubuntu14.04 或 wget 1.15 是否与 TLS 1.0 网站不兼容? 我是否需要 install/download 任何 library/software 才能启用此连接?

... right now it happens only to the website I'm testing. I can't post it here because it's confidential.

那我猜它是与 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 作为最佳版本。

Is Ubuntu 14.04 or wget 1.15 not compatible with TLS 1.0 websites? Do I need to install/download any library/software to enable this connection?

问题出在服务器,而不是客户端。 大多数浏览器通过重试较低版本来解决这些损坏的服务器。如果第一次连接尝试失败,大多数其他应用程序将永久失败,即它们不会自行降级,并且必须通过某些特定于应用程序的设置强制执行另一个版本。

如果您信任主机,请添加有效证书,指定 --no-check-certificate 或添加:

check_certificate = off

进入你的 ~/.wgetrc.

在极少数情况下,您的系统时间可能会不同步,从而使证书失效。

您一定是在使用旧版本的 wget 我遇到了同样的问题。我正在使用 wget 1.12.so 来解决这个问题,有两种方法: 更新 wget 或使用 curl

curl -LO 'https://example.com/filename.tar.gz'

虽然这几乎可以肯定不是 OP 问题,但如果您在代理后面并且不没有正确设置 HTTP_PROXYHTTPS_PROXY 环境变量。确保将 HTTP_PROXYHTTPS_PROXY 设置为指向您的代理。

如果您在大公司工作,这种情况很常见。