在旧版perl中禁用sslv3的情况下连接到服务器时出现问题

在旧版perl中禁用sslv3的情况下连接到服务器时出现问题,perl,ssl,openssl,rhel,lwp,Perl,Ssl,Openssl,Rhel,Lwp,正如标题所说,我正试图使用非常旧的perl版本,特别是5.10.1,将一些JSON发布到RESTAPI。我在RHEL6上的一个相当古老的遗留代码库中工作。握手失败,错误为500,因为服务器已禁用sslv3。但是,我使用的是LWP和IO::Socket::SSL版本,我认为它们名义上至少支持TLSv1,服务器支持TLSv1,因此我不确定连接失败的原因,因为它应该使用可接受的密码。服务器似乎位于可能相关的cloudfront反向代理之后。我对SSL的了解还不够确切,但问题似乎在于我所关心的服务器的设

正如标题所说,我正试图使用非常旧的perl版本,特别是5.10.1,将一些JSON发布到RESTAPI。我在RHEL6上的一个相当古老的遗留代码库中工作。握手失败,错误为500,因为服务器已禁用sslv3。但是,我使用的是LWP和IO::Socket::SSL版本,我认为它们名义上至少支持TLSv1,服务器支持TLSv1,因此我不确定连接失败的原因,因为它应该使用可接受的密码。服务器似乎位于可能相关的cloudfront反向代理之后。我对SSL的了解还不够确切,但问题似乎在于我所关心的服务器的设置方式,以及使用的perl版本和库如何实现密码。在使用在线浏览器时,我注意到握手在几个不支持SNI的浏览器上失败。可用的openssl版本应该支持这一点,但两种perl SSL实现似乎都不支持。有办法解决这个问题吗

这个问题似乎在处理一个类似的问题,但他们通过安装一个较新版本的perl来解决它,我不确定我能做到这一点,因为这可能会破坏大部分代码库

未解决的bug似乎无意中记录了此行为 我的问题与列出的问题相同,但我也可以连接到openssl主机。我不确定这是否是同一个问题,但我使用的是相同版本的redhat,使用的是相同的软件和相同的不一致行为,因此它看起来很有价值。如果有帮助,我的软件版本如下

openssl-1.0.1e-58.el6_10.i686
perl-Crypt-SSLeay-0.57-17.el6.x86_64
perl-IO-Socket-SSL-1.31-3.el6_8.2.noarch
perl-Net-SSLeay-1.35-10.el6_8.1.x86_64
如果我跑

printf'HTTP/1.0 200 Ok\r\n\r\n'| openssl s_服务器-accept 2000-cert certificate.pem-key key.pem-no_ssl2-no_ssl3-no_tls1

下面的脚本(test.pl)能够使用相同的库进行连接

my $ua = LWP::UserAgent->new(timeout => 600);
my $req = HTTP::Request->new(POST => $ARGV[0]);
$req->content_type('application/json');
$req->content_encoding('gzip');
$req->content('');
my $res = $ua->request($req);
print $res->status_line, "\n";
然而,当我使用相同的库和perl版本运行一个稍微复杂一点的程序时,我会遇到与sslv3握手相关的错误

500 Can't connect to dev.superquoteapi.fis.rcuh.com:443 (SSL connect attempt failed with unknown errorerror:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure)
我甚至试图强制程序只使用TLSv1,但没有效果,下面的代码似乎没有任何影响

my $ua = LWP::UserAgent->new(ssl_opts => {verify_hostname => 0}, SSL_version => '!TLSv12:TLSv1:!SSLv2:!SSLv3', allowed_protocols => ['https']);
下面列出了我实际使用的程序

use LWP;
use IO::Socket::SSL;
my $ua = LWP::UserAgent->new(ssl_opts => {verify_hostname => 0}, SSL_version => '!TLSv12:TLSv1:!SSLv2:!SSLv3', allowed_protocols => ['https']);

my $req = HTTP::Request->new('POST', 'https://dev.superquoteapi.fis.rcuh.com:443/api/quote');

$req->header('Content-Type' => 'application/json');
$req->header('Accept' => 'application/json');
#an api key is required and set in a header, but I won't list that here

open(my $fd, '<', 'data,json') 
    or die "Unable to open file, $!";
my @json=<$fd>;
close($fd)
    or warn "Unable to close the file handle: $!";
$req->content(@json);
my $resp = $ua->request($req);
print $resp->as_string;
这两个程序大致相同。问题似乎出在特定服务器
https://dev.superquoteapi.fis.rcuh.com
处理ssl请求。然而,我对SSL/TLS了解不够,无法有意义地验证这一点,因此为了完整性,我将两者都包括在内


我很抱歉,如果这个问题有点漫无边际,但我真的需要帮助,我只是想提供尽可能多的信息。如果我能提供更多信息,或删除无用信息,请告诉我,我完全无能为力。

添加
是否使用IO::Socket::SSL到工作程序中断它?它不会。删除它并强制使用Net::SSLeay也不能解决问题,我添加了反映这一点的信息。我很难看到工作程序和非工作程序之间的区别。需要做什么才能使工作程序停止工作?交换url就是它的作用。我不确定到底是怎么回事,但我真正关心的服务器与openssl设置不同,导致了这个错误。然而,我可以连接到本地服务器作为概念证明的事实似乎意味着这并不是因为库不能使用必要的密码。这就是我发现的令人困惑的地方,因为据报道,密码似乎不受支持。我可能不需要同时包含这两个程序,但我对ssl的了解还不够多,所以我将它们包括在内。你能建议我改变这个问题吗?好的。对不起,我帮不了你。我不知道如何调试SSL。
use LWP;
use IO::Socket::SSL;
my $ua = LWP::UserAgent->new(ssl_opts => {verify_hostname => 0}, SSL_version => '!TLSv12:TLSv1:!SSLv2:!SSLv3', allowed_protocols => ['https']);

my $req = HTTP::Request->new('POST', 'https://dev.superquoteapi.fis.rcuh.com:443/api/quote');

$req->header('Content-Type' => 'application/json');
$req->header('Accept' => 'application/json');
#an api key is required and set in a header, but I won't list that here

open(my $fd, '<', 'data,json') 
    or die "Unable to open file, $!";
my @json=<$fd>;
close($fd)
    or warn "Unable to close the file handle: $!";
$req->content(@json);
my $resp = $ua->request($req);
print $resp->as_string;
use Net::SSL ();
BEGIN {
  $Net::HTTPS::SSL_SOCKET_CLASS = "Net::SSL"; # Force use of Net::SSL
}