【问题标题】:LWP refuses to connect via HTTPSLWP 拒绝通过 HTTPS 连接
【发布时间】:2013-08-17 12:11:54
【问题描述】:

我正在使用 Perl v5.14.2 和 libwww-perl v6.04-1 在 Debian 上运行以下 Perl sn-p

my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new("GET", "https://google.com/");
my $rep = $ua->request($req);
print $rep->status_line;

这会立即返回“500 无法连接到 google.com:443”。我尝试过使用LWP::Simple, Net::SSLeay, Crypt::SSLeay等,但没有任何成功。

奇怪的是,在另一个运行完全相同的 Perl 和 LWP 版本的 Debian 系统上执行相同的代码是可行的。

所以我认为,底层系统存在一些错误,但其他应用程序 - 例如任何浏览器的 cURL - 都可以正常工作。

另外,openssl s_client -connect google.com:443两个 系统上返回Verify return code: 20 (unable to get local issuer certificate)

有没有人遇到过这种现象并有解决办法?

【问题讨论】:

  • 尝试wget https://google.com/ 确保网络没有阻塞流量
  • 这很好用。如前所述,它也适用于其他编程语言或软件。它似乎是特定于 perl 的。有什么方法可以让 LWP 更加冗长?
  • 当然它提供了更多。你有 LWP::Protocol::https 吗?
  • 下一步是开启https调试选项use IO::Socket::SSL qw(debug3); / $ENV{HTTPS_DEBUG} ... pastebin?它像 7 行,FWIW 以供将来参考,请更新您的帖子 :)
  • HTTPS 调试给了我解决方案,一个与bug 相关的 SSL 版本错误,我很久以前在 IO::Socket::SSL 中应用了它的解决方法,但我已经忘记了。重新安装产生了预期的结果。谢谢!也许您应该将提示use IO::Socket::SSL qw(debug3); 作为答案,这在一般情况下肯定会有所帮助。

标签: perl https debian lwp


【解决方案1】:

而不是这个:

$ua = LWP::UserAgent->new;

尝试使用这个:

$ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });

【讨论】:

  • 感谢您的回答,但正如我在问题和 cmets 中指出的那样,“将 verify_hostname 设置为零没有任何区别”。在一般情况下它可能会有所帮助,但在这个特定的情况下可能会有所帮助,如果您阅读 cmets 中的讨论,您可以观察到该问题的解决方式有所不同。
【解决方案2】:

仅供其他与 LWP 500 错误作斗争的人参考:

一些 LWP 500 错误显然是由另一种类型的 SSL 问题引起的(通过 verify_hostname 设置无法解决)。相反,LWP 可能正在与 HTTPS 服务器通信,但响应不是 LWP 所期望的。就我而言,解决方案是通过以下方式强制使用 SSLv3:

my %ssl_options = (SSL_version => 'SSLv3');
$ua = LWP::UserAgent->new(ssl_opts => \%ssl_options), 

此外,对于任何试图弄清楚您遇到什么样的 500 错误的人,请将其与您的错误一起输出:

print $response->as_string;

对于我的问题(通过设置 SSLv3 解决),我的 $response->as_string 输出包括:

“SSL 例程:SSL23_GET_SERVER_HELLO:sslv3 警报意外消息 LWP”

我还要说我的代码在早期版本的 Ubuntu 上运行良好多年。这个问题只有在我升级 Ubuntu 后才出现。我得出的结论是,新版本的 LWP 与旧版本的不同之处可能有多种,因此开发人员要小心!

祝您好运解决您的 LWP 问题!

【讨论】:

    【解决方案3】:

    我在使用 Strawberry Perl 的 Windows Server 2003 上遇到了这个问题。错误 500 是 IO::Socket::IP 的问题。

    重新安装模块(在cpan,强制安装IO::Socket::IP)解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2014-12-10
      • 1970-01-01
      • 2023-04-03
      • 2021-01-16
      • 1970-01-01
      • 2015-09-09
      • 2017-01-13
      • 1970-01-01
      • 2021-05-05
      相关资源
      最近更新 更多