Wget SSL握手失败警报

53

我正试图从一个https站点下载文件,但始终收到以下错误提示:

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

从在线博客中了解到,我需要提供服务器证书和客户端证书。我已经找到了有关如何下载服务器证书的步骤,但没有找到客户端证书的步骤。请问是否有完整的步骤集可用于使用带SSL的wget?我还尝试使用--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

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


1
这可能是任何问题,例如不支持的协议、密码、SNI等等。但通常与服务器证书验证无关。请添加更多细节,如wget版本、openssl版本和您尝试访问的站点。还可以使用wget -v --debug命令。 - Steffen Ullrich
请帮我解决这个问题。我将非常感激。https://security.stackexchange.com/questions/240008/unsupported-protocol-ssl-c1124 - cot3ch cot3ch
你到底想做什么?在标准的SSL/TLS配置中,服务器证书将在握手期间由服务器提供,并且不会有客户端证书。 - erebus
8个回答

49

这里使用相同版本的OpenSSL,但是使用更新版本的wget(1.15)可以正常工作。查看Changelog,关于您的问题有以下显著更改:

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。谢谢你的提示! - Florian Straub
1
那么,如果我们作为一个没有升级“任何”软件包可能性的用户在RHEL 6服务器上工作,我们该如何解决这个问题? - Vitor
@Vitor:如果您使用的是最新版本的RHEL 6,则使用的是wget-1.12-10。根据此处支持SNI已于2014年被回溯到wget-1.12-4。如果它对您不起作用,那么可能是另一个问题,因此您应该创建一个具有足够细节的新问题。 - Steffen Ullrich
它可行。我必须升级到wget 1.21版本。 - Hoàng Huỳnh Nhật

9
您可能使用的是较旧版本的wget。我建议您使用Windows软件包管理器Chocolatey来安装wget。这应该会给您提供一个更新的版本(如果不是最新的)。
在已安装Chocolatey(以管理员身份)之后运行以下命令:
choco install wget

这个方法虽然可行,但有些令人困惑。我不得不升级我的wget,但我必须从管理员控制台进行升级。这一点应该被提及。用户不需要运行chocolatey powershell wget也应该被说明。安装程序会添加powershell wget包装器和二进制文件。因此,这有点不太干净。 - MrMesees

3

一种替代方案是将您尝试下载的URL中的“https”替换为“http”,以绕过SSL连接。虽然这不是最安全的解决方案,但在我的情况下有效。


2
对于许多网站来说,它们会再次重定向到https。 - FindOutIslamNow

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

10
"--secure-protocol"可以是"auto"、"SSLv2"、"SSLv3"或"TLSv1"。没有"TLSv1.2"选项。 - Serge S.
1
但是有一个选项 --secure-protocol=TLSv1_2。我猜这只是一个打字错误。 - beliz
wget: --secure-protocol: 无效值 `TLSv1_2'。 - Andrej K

1

我在Ubuntu 12.04.3 LTS上遇到了这个问题(已经超出了EOL,我知道...),解决方法如下:

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

0
否则,使用curl可能会更简单。 没有特殊的需求需要指定任何选项,可以简单地执行以下操作:
curl https://example.com/filename.zip

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


这已经被建议过了 https://dev59.com/d10a5IYBdhLWcg3wAEk3#58748631 - Tranbi
请添加更多细节以扩展您的答案,例如工作代码或文档引用。 - Community

0

0

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

只需更新您的wget:

sudo apt-get install wget

或者如果它已经支持其他安全协议,请将其作为参数添加:

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


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