HTTPS代理服务器和LWP :: UserAgent的(HTTPS Proxy and LWP::

2019-06-27 09:00发布

我已阅读了多个线程在众多网站和我仍然无法使这项工作。

我有一个客户机(OSX)与OpenSSL的0.9.8r运行的Perl 5.12.4,与LWP 6.0.4,更新地穴:: SSLeay的,网:: SSL等我试图连接到HTTPS站点( HTTPS:/ /github.com中的例子)通过我已经在Windows VM上运行的Wingate代理。 请注意,我的实际应用程序连接到一个SSL Web服务,我没有控制权。

从Firefox,指着代理一切COPACETIC。 该页面加载成功,我看到了代理软件活动监视器的连接。 我会该死如果我可以使它在Perl的工作,虽然。 我已经开始与这个堆栈溢出问题的代码: 如何强制LWP使用地穴:: 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: 

如果任何人都可以在这里提供一些指导,我将不胜感激!

Answer 1:

我刚刚上传的LWP ::协议::连接模块到CPAN。 该模块增加了LWP缺少的HTTP / CONNECT方法的支持。

  use LWP::UserAgent;

  $ua = LWP::UserAgent->new(); 
  $ua->proxy('https', 'connect://proxyhost.domain:3128/');

  $ua->get('https://www.somesslsite.com');

有了这个模块,你可以使用常规的IO ::插座::对于LWP> = 6.00 SSL实现。



Answer 2:

为什么要“强制使用的Net :: SSL的”。 尝试

#!/usr/bin/perl    
use strict;
use warnings;
use LWP::UserAgent;

BEGIN {
  $ENV{HTTPS_PROXY} = 'https://192.168.1.11:80';
#  $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
  $ENV{HTTPS_DEBUG} = 1;  #Add debug output
}

my $ua = LWP::UserAgent->new();
my $req = HTTP::Request->new('GET','https://github.com/');
my $response = $ua->request($req);
print $response->code ."\n";

一出就把200应该意味着没有错误。

我的一个在下面的示例代码工作完美

#!/usr/bin/perl
use warnings;
use LWP::UserAgent;

BEGIN {
  $ENV{HTTPS_PROXY} = 'https://176.9.209.113:8080'; #Valid HTTPS proxy taken from http://hidemyass.com/proxy-list/
  $ENV{HTTPS_DEBUG} = 1;
}

my $ua = new LWP::UserAgent;
my $req = new HTTP::Request('GET', 'https://www.nodeworks.com');
my $res = $ua->request($req);
print $res->code, "\n";

输出 -

200
SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
SSL_connect:SSLv3 read server hello A
SSL_connect:SSLv3 read server certificate A
SSL_connect:SSLv3 read server key exchange A
SSL_connect:SSLv3 read server done A
SSL_connect:SSLv3 write client key exchange A
SSL_connect:SSLv3 write change cipher spec A
SSL_connect:SSLv3 write finished A
SSL_connect:SSLv3 flush data
SSL_connect:SSLv3 read finished A
SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
SSL_connect:SSLv3 read server hello A
SSL_connect:SSLv3 read server certificate A
SSL_connect:SSLv3 read server key exchange A
SSL_connect:SSLv3 read server done A
SSL_connect:SSLv3 write client key exchange A
SSL_connect:SSLv3 write change cipher spec A
SSL_connect:SSLv3 write finished A
SSL_connect:SSLv3 flush data
SSL_connect:SSLv3 read finished A

Tool completed successfully

随着https://github.com/输出为-

200
SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
SSL_connect:SSLv3 read server hello A
SSL_connect:SSLv3 read server certificate A
SSL_connect:SSLv3 read server done A
SSL_connect:SSLv3 write client key exchange A
SSL_connect:SSLv3 write change cipher spec A
SSL_connect:SSLv3 write finished A
SSL_connect:SSLv3 flush data
SSL_connect:SSLv3 read finished A

Tool completed successfully

所以,说了这么多。 您的代码版本(下)应该工作细

use warnings;
use LWP::UserAgent;

BEGIN {
  $ENV{HTTPS_PROXY} = 'https://176.9.209.113:8080';
  $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; #works even with this
  $ENV{HTTPS_DEBUG} = 1;  #Add debug output
}

my $ua = new LWP::UserAgent;
my $req = new HTTP::Request('GET', 'https://github.com/');
my $res = $ua->request($req);
print $res->code, "\n";

if ($res->is_success) {
     print $res->decoded_content;  # or whatever
     exit(0);
}
else {
 print "\nFail:\n";
     print $res->status_line ."\n";
     exit(1);
}


Answer 3:

我几乎碰到了同样的问题。 下面是固定的为我的事情:

  • 确保您使用地穴:: SSLeay的0.58或更低。 至少0.64无休止地封闭箱(如在描述http://cpanforum.com/posts/13808 ),而0.57 / 0.58的工作。
  • 确保网:: HTTP已经更新到至少6.03(避免https://rt.cpan.org/Public/Bug/Display.html?id=72790 )


Answer 4:

而不是使用的Net :: SSL它并没有提供太多的主机验证(无SNI),您可以使用Net :: SSLGlue :: LWP。 这猴子补丁LWP使https_proxy可以使用默认的SSL后端IO ::插座:: SSL使用:

use Net::SSLGlue::LWP; # do this first
use LWP::Simple;
... continue with normal LWP stuff..


Answer 5:

我知道这可能是一个死的问题,但如果别人打它,我已经另一个角度......我不能保证任何答案,但我们面临的一个长期在$工作问题,在这一领域,但随着squid代理,也许具体使用X509客户端证书的。

使用网:: SSL覆盖是解决方案的一部分,但我担心的WinGate可能是问题(而不是什么事情我可以帮忙带)虽然在我们的例子中,我们通过HTTP连接到代理(不知道如何LWP交易与代理+ HTTPS)。

为了记录在案,这里是代码的具体形式,我们使用的一个例子:

use Net::SSL;
$ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS}="Net::SSL";
use LWP::UserAgent;
use LWP::Protocol::https;
my $ua = LWP::UserAgent->new;
$ENV{HTTPS_PROXY} = 'http://cache.local.employer.co.uk:80';
$ua->get("https://example.com/");

这是Perl的5.8.8最近CPAN安装(因此分离L:P:HTTPS),所以我们有一个新的Net :: HTTP。

我要提的Net :: HTTP的某些型号喝醉了的,但我才意识到那是在马丁的回答我CPAN的错误:)

很抱歉,如果这不添加任何东西。



Answer 6:

我已经发出了拉请求上的libwww-perl的库来解决(或可能的解决办法...)的问题。

这个PR的评论显示了一个简单的程序,通过代理与HTTPS来github.com连接。 有了这个补丁就没有必要浪费时间与程序ENV%。

另一个好处是,你可以重新使用通常https_proxy设置。



Answer 7:

目前已在伯爵5.8错误和一些进一步的模块,其中环境变量HTTP_PROXY不正确地设置代理服务器连接。

你的情况下,具有这样的错误报道这里作为提到的问题https://bugzilla.redhat.com/show_bug.cgi?id=1094440

使用这个更好的办法是没有环境变量和使用LWP的UserAgent

 `use LWP::UserAgent;
  $ua = LWP::UserAgent->new(); 
  $ua->proxy('https', 'connect://proxyhost.domain:3128/');`


Answer 8:

 #!/usr/bin/env perl # # mimvp.com # 2017-03-28 use CGI; use strict; use LWP::UserAgent; our %proxy_https = ("https", "connect://173.233.55.118:443"); our $mimvp_url = "https://proxy.mimvp.com/exist.php"; ## https ## 1. download LWP-Protocol-connect (wget http://search.cpan.org/CPAN/authors/id/B/BE/BENNING/LWP-Protocol-connect-6.09.tar.gz) ## 2. tar zxvf LWP-Protocol-connect-6.09.tar.gz ## cd LWP-Protocol-connect-6.09 ## perl Makefile.PL ## make ## sudo make install sub test_connect { my ($url, %proxy) = @_; print "proxy : $proxy{'http'}\n"; print "https : $proxy{'https'}\n"; print "socks4 : $proxy{'socks4'}\n"; print "socks5 : $proxy{'socks5'}\n"; print "url : $url\n"; my $browser = LWP::UserAgent->new(); $browser->env_proxy(); # # 设置的代理格式$browser->proxy(%proxy); $browser->timeout(30); $browser->agent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'); # my $req = new HTTP::Request('GET', $url); # my $response = $browser->request($req); my $response = $browser->get($url); # 爬取的网址my $is_success = $response->is_success(); # 1 my $content_type = $response->content_type(); # text/html my $content = $response->content(); # 网页正文my $content_length = length($content); # 网页正文长度print "$is_success\n"; print "$content_type\n"; print "$content_length\n"; print "$content\n"; } test_connect($mimvp_url, %proxy_https); # https ## perl mimvp-proxy-perl.pl 



文章来源: HTTPS Proxy and LWP::UserAgent