【问题标题】:wget ssl alert handshake failurewget ssl警报握手失败
【发布时间】:2015-08-29 08:06:15
【问题描述】:

我正在尝试从 https 站点下载文件并不断收到以下错误:

OpenSSL: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
Unable to establish SSL connection.

通过在线阅读博客,我了解到我必须提供服务器证书和客户端证书。我找到了有关如何下载服务器证书而不是客户端证书的步骤。有没有人有一套完整的步骤来使用 wget 和 SSL?我也尝试了 --no-check-certificate 选项,但没有奏效。

wget version: wget-1.13.4
openssl version: OpenSSL 1.0.1f 6 Jan 2014

尝试从 coursera.org 上的课程网页下载所有讲座资源。因此,URL 看起来像这样:https://class.coursera.org/matrix-002/lecture

在线访问此网页需要表单身份验证,不确定是否导致失败。

【问题讨论】:

  • 这可以是任何东西,例如不受支持的协议、密码、SNI .... 。但它通常与服务器证书的验证无关。请添加更多详细信息,例如 wget 版本、openssl 版本和您尝试访问的站点。也可以使用wget -v --debug
  • 请帮我解决这个问题。我将不胜感激。 security.stackexchange.com/questions/240008/…
  • 你到底想做什么?在标准问题 SSL/TLS 配置中,服务器证书将在握手期间由服务器提供,并且不会有客户端证书。

标签: ssl https wget


【解决方案1】:

它从这里开始使用相同的 OpenSSL 版本,但更新版本的 wget (1.15)。查看变更日志,您的问题有以下重大变化:

1.14:添加对 TLS 服务器名称指示的支持。

请注意,此站点不需要 SNI。但是www.coursera.org 需要它。 如果您使用 -v --debug 调用 wget(正如我在评论中明确推荐的那样!),您将看到:

$ wget https://class.coursera.org
...
HTTP request sent, awaiting response...
  HTTP/1.1 302 Found
...
Location: https://www.coursera.org/ [following]
...
Connecting to www.coursera.org (www.coursera.org)|54.230.46.78|:443... connected.
OpenSSL: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
Unable to establish SSL connection.

所以错误实际上发生在www.coursera.org 上,原因是缺少对 SNI 的支持。您需要升级您的 wget 版本。

【讨论】:

  • 从未想过要更新 wget。感谢您的提示!
  • 那么,如果我们以用户身份在 RHEL 6 服务器上工作,并且不可能升级 any 软件包,我们如何克服这样的问题?
  • @Vitor:如果您使用的是最新版本的 RHEL 6,那么您使用的是 wget-1.12-10。根据this,对 SNI 的支持在 2014 年被向后移植到 wget-1.12-4。如果它对您不起作用,则可能是另一个问题,因此您应该创建一个包含足够详细信息的新问题。
【解决方案2】:

你可能有一个旧版本的 wget。我建议使用 Windows 包管理器 Chocolatey 安装 wget。这应该会给你一个更新的版本(如果不是最新的)。

安装 Chocolatey 后运行此命令(以管理员身份):

choco install wget

【讨论】:

  • 这行得通,但令人困惑。我必须升级我的 wget,但我必须从管理员控制台升级。这应该被提及。应该是用户不需要运行巧克力般的 powershell wget。安装同时添加了一个 powershell wget 包装器和二进制文件。因此,它有点不干净
【解决方案3】:

我在 SLES12 中,对我来说,它在升级到 wget 1.14、使用 --secure-protocol=TLSv1.2 和使用 --auth-no-challenge 后工作。

wget --no-check-certificate --secure-protocol=TLSv1.2 --user=satul --password=xxx --auth-no-challenge -v --debug https://jenkins-server/artifact/build.x86_64.tgz

【讨论】:

  • --secure-protocol 可以是 autoSSLv2SSLv3TLSv1。没有选项TLSv1.2
  • 但是有一个选项--secure-protocol=TLSv1_2。我想这只是一个错字。
  • wget: --secure-protocol: 无效值`TLSv1_2'。
【解决方案4】:

另一种方法是将您尝试下载的网址中的“https”替换为“http”,以绕过 SSL 连接。不是最安全的解决方案,但这对我来说很有效。

【讨论】:

  • 对于许多网站,它会再次重定向到 https
【解决方案5】:

我在 Ubuntu 12.04.3 LTS(远远超出 EOL,我知道...)上遇到了这个问题,并通过以下方式解决了这个问题:

sudo apt-get update && sudo apt-get install ca-certificates

【讨论】:

    【解决方案6】:

    基本上您的 OpenSSL 使用 SSLv3,而您正在访问的站点不支持该协议。

    只需更新您的 wget:

    sudo apt-get install wget

    或者如果它已经支持另一个安全协议,只需将其添加为参数:

    wget https://example.com --secure-protocol=PROTOCOL_v1

    【讨论】:

      【解决方案7】:

      以下命令用于从 TLSv1.2 网站下载文件。

      curl -v --tlsv1.2 https://example.com/filename.zip

      成功了!

      【讨论】:

        【解决方案8】:

        否则使用 curl 可能会更简单。 没有特别需要指定任何选项,可以很简单:

        curl https://example.com/filename.zip
        

        使用 curl 在遇到 wget SSL 错误时无需添加 -v 选项。

        【讨论】:

        猜你喜欢
        • 2020-09-14
        • 1970-01-01
        • 2019-05-26
        • 2017-02-17
        • 2016-05-26
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        • 2018-07-11
        相关资源
        最近更新 更多