my $ua = LWP::UserAgent->new();
my $res = $ua->get("https://url");
print $res->content;
导致证书无效的响应(如果我禁用了主机名验证,服务器会说我需要加密),直到我开始使用Net::SSL
:
$ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = 'Net::SSL';
在做我的请求之前,ofc。
目前的模块版本:
Crypt::SSLeay 0.58
IO::Socket::SSL 1.955
Net::SSLeay 1.55
LWP 6.05
LWP::Protocol::https 6.04
还尝试了最新的Crypt::SSLeay
,但仍然失败了(在测试环境中尝试过这种方法)。
这只是Crypt::SSLeay
库中客户端和服务器之间的限制 - 他们可能不同意加密方法吗?
我还使用OpenSSL
手动连接到有问题的服务器,该服务器没有问题,没有证书失败等。
我的问题已经解决了,但不是一种感觉非常优雅的方式,但我很好奇错误在哪里,因为我花了很多时间试图找到解决方案,以及问题的根源。我发送SSL请求到数百个其他服务器没有这个问题,但是这个服务器只会回复一条消息,说我需要加密我的请求。
LWP
是否更支持Net:SSL
?
您如何尝试追踪问题的根源?
编辑:有趣的是,在旧版本的模块中没有发生这种情况(最近有效)。我强烈怀疑它是LWP或更新的东西。奇怪的是,行为在更新中如何改变。答案 0 :(得分:1)
如果它说证书无效,它可能无法验证它,因为它是自签名的,CA不知道或类似的问题。如果我理解你,它只在这个特定的服务器上失败,那么它的证书可能有问题。如果您收到浏览器错误消息,请检查。 如果我知道确切的网址并且可以访问它,则可能会提供更多帮助。
至于Net :: SSL与IO :: Socket :: SSL:最近的LWP版本默认使用IO :: Socket :: SSL(基于Net :: SSLeay)而不是旧的Net :: SSL / Crypt :: SSLeay,因为IO :: Socket :: SSL具有更多功能,更正确的证书验证并且正在积极开发中。
Steffen(IO :: Socket :: SSL的当前维护者/开发者)
答案 1 :(得分:0)
某些服务器不支持TLSv1.2。默认情况下,LWP将连接到某些服务器,但不会连接到需要较低TLS版本的服务器。我使用LWP 6.0x对https进行了非常通用的500错误,并将LWP :: UserAgent设置为SSL_version => 'TLSv1'对我不起作用。尝试强制LWP仅使用IO :: Socket :: SSL并强制TLS版本进行其他测试。