0
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 或更新的东西。奇怪的是行为如何在更新中发生这样的变化。

4

2 回答 2

1

如果它说证书无效,它可能无法验证它,因为它是自签名的、CA 不知道或类似问题。如果我理解正确,它只会在这个特定的服务器上失败,所以它的证书可能有问题。请检查,如果您也收到浏览器的错误消息。如果我知道确切的 url 并且可以访问它,可能会提供更多帮助。

至于 Net::SSL 与 IO::Socket::SSL:最近的 LWP 版本默认使用 IO::Socket::SSL(基于 Net::SSLeay)而不是旧的 Net::SSL/Crypt: :SSLeay,因为 IO::Socket::SSL 具有更多功能,更正确的证书验证,并且正在积极开发中。

Steffen(IO::Socket::SSL 的当前维护者/开发者)

于 2013-12-08T23:02:28.497 回答
0

某些服务器不支持 TLSv1.2。默认情况下,LWP 将连接到某些服务器,但不会连接到需要较低 TLS 版本的服务器。我在使用 LWP 6.0x 的 https 上遇到了一个非常通用的 500 错误,并且将 LWP::UserAgent 设置为 SSL_version => 'TLSv1' 对我不起作用。尝试强制 LWP 仅使用 IO::Socket::SSL 并强制 TLS 版本进行额外测试。

LWP::UserAgent 无法使用 TLS1.1 发布

于 2013-11-30T21:10:35.633 回答