我已经阅读了许多网站上的许多主题,但仍然无法完成这项工作。
我有一台运行 perl 5.12.4 的 OpenSSL 0.9.8r 客户端机器(OSX),使用 LWP 6.0.4,更新了 Crypt::SSLeay,Net::SSL 等。我正在尝试连接到 HTTPS 站点(https:// /github.com在示例中)通过我在 Windows VM 上运行的 WinGate 代理。请注意,我的实际应用程序附加到我无法控制的 SSL Web 服务。
从 Firefox,指向代理一切都是 copacci。页面加载成功,我在代理软件活动监视器中看到了连接。如果我可以让它在 Perl 中工作,我会被诅咒的。我从这个堆栈溢出问题的代码开始:如何强制 LWP 使用 Crypt::SSLeay 进行 HTTPS 请求?并添加了一些调试和附加输出。这是我现在的立场:
#!/usr/bin/perl
use strict;
use warnings;
use Net::SSL (); # From Crypt-SSLeay
BEGIN {
$Net::HTTPS::HTTPS_SSL_SOCKET_CLASS = "Net::SSL"; # Force use of Net::SSL
$ENV{HTTPS_PROXY} = 'https://192.168.1.11:80';
# $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
$ENV{HTTPS_DEBUG} = 1; #Add debug output
}
use LWP::UserAgent;
my $ua = LWP::UserAgent->new();
my $req = HTTP::Request->new('GET','https://github.com/');
my $response = $ua->request($req);
print "--\n";
print "$_\n" for grep { $_ =~ /SSL/ } keys %INC;
print "--\n";
if ($response->is_success) {
print $response->decoded_content; # or whatever
exit(0);
}
else {
print "\nFail:\n";
print $response->status_line ."\n";
exit(1);
}
这是此代码的输出:
--
Crypt/SSLeay.pm
Crypt/SSLeay/X509.pm
Net/SSL.pm
--
Fail:
500 Can't connect to github.com:443 (Crypt-SSLeay can't verify hostnames)
如果我然后取消注释$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
,我确实在代理上看到了一个到 github.com:443 的连接,然后什么也没有。(请注意,它通过代理在 Web 浏览器中运行良好)。在挂了很多之后,我从脚本中得到以下输出:
SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
SSL_connect:before/connect initialization
SSL_connect:SSLv3 write client hello A
SSL_connect:failed in SSLv3 read server hello A
SSL_connect:before/connect initialization
SSL_connect:SSLv2 write client hello A
SSL_connect:failed in SSLv2 read server hello A
--
Crypt/SSLeay.pm
Crypt/SSLeay/X509.pm
Net/SSL.pm
Crypt/SSLeay/CTX.pm
Crypt/SSLeay/MainContext.pm
--
Fail:
500 SSL negotiation failed:
如果有人可以在这里提供一些指导,我将不胜感激!