wget ssl 警报握手失败

wget ssl alert handshake failure

我正在尝试从 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

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

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

1.14: Add support for TLS Server Name Indication.

请注意,此站点不需要 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 版本。

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

只需更新您的 wget:

sudo apt-get install wget

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

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

我在 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

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

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

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

您可能使用的是旧版本的 wget。我建议使用 Chocolatey 安装 wget,Windows 的包管理器。这应该为您提供更新的版本(如果不是最新的)。

运行 安装 Chocolatey 后执行此命令(作为管理员):

choco install wget

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

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

成功了!

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

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

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