我的 Windows XP Pro 系统出现了一个新问题,下面的 Perl 代码证明了这一点(当然,这是从一个更大的程序中截取的一个非常精简的示例)。
直到几天前它还可以工作,我正在绞尽脑汁想弄清楚系统上可能发生了什么变化以阻止它工作,我希望这里有人可以给我一些线索。 (它在我的 Windows 8.1 系统上仍然可以正常工作。)
问题是下面的代码(现在)失败并显示“500 SSL 协商失败”。
use strict;
use warnings;
use HTTP::Request;
use LWP::UserAgent;
$ENV{HTTPS_DEBUG} = 1;
my $url = "https://secure.quksdns4.net:2087/";
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new (GET => $url);
my $res = $ua->request($req);
my $sts = $res->code;
my $hdr = $res->headers_as_string;
my $txt = $res->content;
print "\n".$sts."\n\n".$hdr."\n";
print $txt if ($sts == 500);
exit;
输出是:
SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
SSL_connect:error in SSLv2/v3 read server hello A
SSL_connect:before/connect initialization
SSL_connect:SSLv3 write client hello A
SSL3 alert read:fatal:handshake failure
SSL_connect:failed in SSLv3 read server hello A
SSL_connect:before/connect initialization
SSL_connect:SSLv2 write client hello A
SSL_connect:error in SSLv2 read server hello A
500
Content-Type: text/plain
Client-Date: Sat, 25 Oct 2014 14:52:43 GMT
Client-Warning: Internal response
500 SSL negotiation failed:
奇怪的是,如果端口号 (:2087) 被删除,它仍然有效(尽管不是很有用!)。
Active Perl v5.8.8(多年来我没有改变),ssleay32 和 libeay32 dll 是 0.9.8.1(多年来也没有变化),虽然系统上有一些 C:\Perl\bin是路径中唯一的。
感谢收到有关可能已更改以停止上述工作的任何提示!
最佳答案
简而言之:我猜对端刚刚禁用了 SSL 3.0(至少在端口 2087 上),因为 POODLE attack并且由于您仍在不受支持的操作系统上使用非常旧的软件,因此您仍会尝试使用 SSL 3.0 进行连接。
编辑:看起来 Crypt::SSLeay 的 0.57 版(此时 LWP 需要)已经使用了 SSLv23 握手,理论上应该与 TLS 1.x 兼容。这也可以在调试输出中看到(SSLv2/v3 write client hello
)。所以我猜测原因可能至少是以下之一:
- 您使用的是不支持 TLS1.0 的 openssl 版本。你给的版本号是0.9.8.1,但是这种版本从来没有存在过。您的意思是看起来相似(并支持 TLS1.0)的 0.9.8l,或者您的意思完全不同。
- 他们不仅从对等方移除了 SSL 3.0,而且还修正了密码,因此它现在需要您的旧 OpenSSL 尚不支持的密码。
- 或者他们不仅需要 TLS 1.0+,还需要 TLS 1.1+。但自 OpenSSL 版本 1.0.1 起才包含对 TLS1.1 的支持。
关于perl - 500 SSL 协商失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26564028/