在Ubuntu 14.04 LTS上使用wget无法建立SSL连接

43

我尝试使用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),GNU Wget 1.15在linux-gnu上构建,我无法使用上述代码下载图像。

另一个变量是www.website.com使用TLS 1.0。我不知道这如何影响wget。但如果我从TLS 1.2网站wget图像,则两个测试案例均不会出现任何ssl连接错误。

Ubuntu 14.04或wget 1.15与TLS 1.0网站不兼容吗?是否需要安装/下载任何库/软件以启用此连接?


这听起来像是wget在SSL握手期间失败了。这很可能是因为您的Ubuntu 14.04不信任www.website.com域名。您可能需要将此网站的服务器证书安装到您的信任存储中。 - Tim Biegeleisen
如果这个错误也发生在其他 SSL 网站上,请将此信息添加到您的问题中。如果这只发生在特定的网站上,并且该网站在浏览器中可以正常工作,请提供确切的 URL。如果这个网站在浏览器中也无法工作,那么这就是一个网站本身的问题。 - Steffen Ullrich
@TimBiegeleisen 我通过 Chrome 下载了 www.website.com 的证书:单击锁图标 -> 连接选项卡 -> 证书信息链接 -> 细节 -> URI 链接。然后我将其复制到服务器上,按照如何安装根证书的步骤进行操作(http://askubuntu.com/questions/73287/how-do-i-install-a-root-certificate)。然后,在 /etc/ssl/certs$ ls 后,我在那里找到了该证书。我尝试再次使用 wget,但仍然出现相同的错误。 - xanderlopez
@SteffenUllrich 目前只发生在我正在测试的网站上。我不能在这里发布它,因为它是机密的。 - xanderlopez
可能是重复的问题:无法建立SSL连接,如何修复我的SSL证书? - kenorb
如果您身处某种代理后面并且未设置 HTTP_PROXY 和 HTTPS_PROXY 环境变量,则可能会遇到此错误。 - Matt Messersmith
7个回答

28

你一定是在使用旧版的wget,我之前也遇到过同样的问题。我使用的是wget 1.12,为了解决这个问题,有两种方法: 更新wget,或者使用 curl

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

2
应该使用curl而不是culr。很抱歉我还不能修改它。 - Markus

26
...目前只有我正在测试的网站出现了这种情况。由于是机密信息,我无法在此发布。

那么我猜测这可能是与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 ... 访问该站点。

请注意,可能存在其他原因,但这个原因是最有可能的,在没有访问该站点的情况下,所有都只是猜测。

具体问题如下:通常,客户端使用最兼容的握手方式访问服务器。这是SSLv23握手,它兼容旧版SSL版本,但它会声明客户端支持的最佳TLS版本,以便服务器选择最佳版本。在这种情况下,wget会宣布支持TLS1.2。但是,有些破损的服务器从未想过有一天会有像TLS1.2这样的东西,如果客户端宣布支持这个热门的新版本(从2008年起!),而不是只响应服务器支持的最佳版本,则会拒绝握手。要访问这些破损的服务器,客户端必须欺骗并声称它只支持TLS1.0作为最佳版本。

Ubuntu 14.04或wget 1.15是否与TLS 1.0网站不兼容?我需要安装/下载任何库/软件以启用此连接吗?

问题出在服务器上,而不是客户端。大多数浏览器通过重试较低版本来解决这些破损的服务器。大多数其他应用程序如果第一次连接尝试失败,则永久失败,即它们不会自动降级,一些应用程序需要通过特定设置强制使用其他版本。


一个类似的机密网站是https://www.playboyplus.com - 无论有没有"--secure-protocol=TLSv1",它有时能够工作,有时不能够工作。对我来说,在10次尝试中有4次是可以工作的。 - Joe Jobs
使用curl时情况是一样的 - "curl -kLo a.htm https://www.playboyplus.com" - 有时候可以工作,有时候会出现"OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to www.playboyplus.com:443"。 - Joe Jobs
@JoeJobs:如果您想获得有关问题的帮助,请提出一个新问题,不要在评论中询问,尤其是不要询问多年前的问题和答案。无论如何,由于客户端和服务器上的TLS堆栈在最近几年中发生了变化,导致问题的原因可能与此处讨论的不同。 - Steffen Ullrich

10

虽然这几乎肯定不是OP的问题,但如果您在代理后面并且没有正确设置HTTP_PROXYHTTPS_PROXY环境变量,您也可能从wget得到无法建立SSL连接。请确保将HTTP_PROXYHTTPS_PROXY设置为指向您的代理。

如果您在大型公司工作,则这是一种常见情况。


我想问一下您能否详细说明如何设置这些环境变量或提供有关它们位置的信息。我在远程服务器上遇到了同样的问题(我可以进行配置),但在我的笔记本电脑上没有。先谢谢了。 - ego2509
1
@ego2509 如何设置它们将取决于您的 shell。在 bash 中,它是 export <var>=<value>。在 powershell 中,它是 $Env:<var> = <value>。代理变量名称也取决于应用程序,但 HTTP_PROXYHTTPS_PROXY 受到绝大多数 Linux 应用程序(包括 wget)的支持。详情请参见:https://unix.stackexchange.com/questions/212894/whats-the-right-format-for-the-http-proxy-environment-variable-caps-or-no-ca - Matt Messersmith

3
如果您信任主机,可以添加有效证书、指定--no-check-certificate或添加以下内容:
check_certificate = off

将以下内容添加到您的~/.wgetrc文件中。

在某些罕见情况下,您的系统时间可能不同步,从而使证书无效。


0
我尝试了这个和类似页面上写的所有方法,但对我都没有用。当我在URL中将 https 改成 http 后,它可以正常运行。
你可以作为最后一招尝试一下这个方法。

0
这是我解决问题的方法。我使用了“m3w”下载命令。 “m3w”命令的基本用法: m3w www.exemple.com 注意:一旦您下载到文件,您需要使用ESC/s保存文件。

答案并没有直接回答问题,而是使用其他工具提供了一种解决方法。 - Krishh

-2

我曾经遇到过相同的问题,使用 sudo 前缀帮助了我,这表明我没有普通用户的权限。


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接