【问题标题】:Unable to establish SSL connection upon wget on Ubuntu 14.04 LTS无法在 Ubuntu 14.04 LTS 上的 wget 上建立 SSL 连接
【发布时间】:2015-04-29 16:51:31
【问题描述】:

我尝试通过 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 基于 linux-gnu 构建的 Wget 1.13.4,我能够下载图像 使用上面的代码。没有错误。
  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 连接错误。

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

【问题讨论】:

  • 这听起来像wget 在 SSL 握手期间失败。这很可能是因为您的 Ubuntu 14.04 不信任域 www.website.com。您可能需要将此网站的服务器证书安装到您的信任库中。
  • 如果任何其他 SSL 站点发生此错误,请将此信息添加到您的问题中。如果这种情况仅发生在特定站点并且该站点在浏览器中有效,则显示确切的 URL。如果此站点在浏览器中也无法运行,则站点本身就是一个问题。
  • @TimBiegeleisen 我通过 Chrome 下载了 www.website.com 的证书:点击锁标志 -> 连接选项卡 -> 证书信息链接 -> 详细信息 -> URI 链接。然后我将它复制到服务器,然后按照如何安装根证书(askubuntu.com/questions/73287/…)。然后在/etc/ssl/certs$ ls 之后,我在那里找到了证书。我再次尝试wget,但仍然遇到同样的错误。
  • @SteffenUllrich 现在它只发生在我正在测试的网站上。我不能在这里发布它,因为它是机密的。

标签: linux ubuntu ssl wget


【解决方案1】:

你必须使用旧版本的 wget 我有同样的问题。我正在使用 wget 1.12.so 来解决这个问题,有两种方法: 更新wget 或使用curl

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

【讨论】:

  • 应该是 curl 而不是 culr。抱歉会改变它,但我还不允许
【解决方案2】:

...现在它只发生在我正在测试的网站上。我不能在这里发布它,因为它是机密的。

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

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

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

【讨论】:

  • playboyplus.com 是一个这样的机密站点 - 有或没有“--secure-protocol=TLSv1”,它有时有效,有时无效。对我来说,它在 10 次尝试中工作了 4 次
  • 使用 curl 时也一样 - “curl -kLo a.htm playboyplus.com” - 有时它有效,有时你得到“OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to www.playboyplus.com:443”
  • @JoeJobs:如果您想在某个问题上获得帮助,请提出一个新问题,不要在 cmets 中提问,尤其是多年前的 Q+A。无论如何,这可能是导致问题的原因与此处讨论的不同,因为近年来客户端和服务器上的 TLS 堆栈都在发展。
【解决方案3】:

虽然这几乎可以肯定不是 OPs 问题,但如果您使用代理并且没有HTTP_PROXYHTTPS_PROXY,您也可以从wget 获得Unable to establish SSL connection环境变量设置正确。确保将HTTP_PROXYHTTPS_PROXY 设置为指向您的代理。

如果您为大公司工作,这是很常见的情况。

【讨论】:

  • 我想问你是否可以详细说明如何设置这些环境变量或提供一些关于它们的位置的信息。我在远程服务器上遇到了同样的问题(我可以配置它),但在我的笔记本电脑上没有。提前致谢
  • @ego2509 如何设置它们取决于你的 shell。在 bash 中,它是 export <var>=<value>。在 powershell 中它是$Env:<var> = <value>。代理变量名称也取决于应用程序,但绝大多数 linux 应用程序(包括 wget)都支持 HTTP_PROXYHTTPS_PROXY。详情:unix.stackexchange.com/questions/212894/…
【解决方案4】:

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

check_certificate = off

到你的~/.wgetrc

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    相关资源
    最近更新 更多