perl - 500 SSL 协商失败

标签 perl ssl windows-xp

我的 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/

相关文章:

image - Image::ValidJpeg 和内存文件的段错误

mysql - AnyEvent::DBI 和数据库重新连接

perl - 如何用 Perl 解析相对日期?

java - Android 上不一致的 SSLv3 握手失败

ssl - 托管不面向用户且仅供 API 使用的服务器的常见做法是什么?

c - 链接 OpenSSL 时对 t1sl_steup_key_block 的 undefined reference

python - 是否可以从 Python 中杀死 Windows 上的进程?

c++ - Win XP x64 上的段错误在 XP x32 上不会发生 - strncpy 问题?怎么修?

regex - Perl - 替换相同字符的序列

c# - 在 Windows XP Embedded 上禁用每个控件的 C# Winforms 应用程序中的右键单击(按住)