6

私は多くのサイトで多くのスレッドを読みましたが、まだこれを機能させることができません。

私はPerl5.12.4を実行しているOpenSSL0.9.8r、LWP 6.0.4、更新されたCrypt :: SSLeay、Net :: SSLなどを備えたクライアントマシン(OSX)を持っています。HTTPSサイト(https:/例では/github.com)WindowsVMで実行しているWinGateプロキシ経由。私の実際のアプリケーションは、私が制御できないSSLWebサービスに接続していることに注意してください。

Firefoxから、プロキシを指すと、すべてが共食いです。ページが正常に読み込まれ、プロキシソフトウェアのアクティビティモニターに接続が表示されます。私はそれをPerlで動作させることができればとんでもないでしょう。このスタックオーバーフローのコードから始めました質問:LWPにHTTPSリクエストにCrypt :: SSLeayを使用させるにはどうすればよいですか?そして、いくつかのデバッグと追加の出力を追加しました。これが私が今立っているところです:

#!/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: 

誰かがここでいくつかの方向性を提供することができれば、私はそれを大いに感謝します!

4

8 に答える 8

7

LWP :: Protocol::connectモジュールをCPANにアップロードしました。このモジュールは、欠落しているHTTP/CONNECTメソッドのサポートをLWPに追加します。

  use LWP::UserAgent;

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

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

このモジュールを使用すると、LWP>=6.00の通常のIO::Socket::SSL実装を使用できます。

于 2013-07-22T12:05:00.357 に答える
3

なぜ「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);
}
于 2012-08-24T21:16:31.007 に答える
1

私はほとんど同じ問題に遭遇しました。これが私のためにそれを修正したものです:

于 2012-09-27T15:47:36.853 に答える
1

多くのホスト検証を提供しない(そしてSNIを提供しない)Net :: SSLを使用する代わりに、Net :: SSLGlue::LWPを使用できます。このモンキーパッチはLWPにパッチを適用して、https_proxyをデフォルトのSSLバックエンドIO :: Socket :: SSL:で使用できるようにします。

use Net::SSLGlue::LWP; # do this first
use LWP::Simple;
... continue with normal LWP stuff..
于 2013-11-04T20:21:47.523 に答える
0

これは死んだ質問かもしれませんが、誰かがそれに当たった場合、私は別の角度になります...私は答えを約束することはできませんが、この分野での$ workで長年の問題に直面しましたが、 Squidプロキシであり、X509クライアント証明書の使用に固有のものである可能性があります。

Net :: SSLオーバーライドの使用は解決策の一部ですが、私たちの場合はhttp経由でプロキシに連絡しますが(LWPがどのように処理するかわからない)、WinGateが問題になる可能性があります(私が支援できるものではありません)。プロキシ+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/");

これは最近のCPANインストール(したがってL:P:httpsの分離)を備えたPerl 5.8.8であるため、新しいNet::HTTPがあります。

Net :: HTTPのいくつかのバージョンが壊れていることに言及するつもりでしたが、Martinの返信でそれが私のCPANのバグであることに気づきました:)

これで何も追加されない場合は申し訳ありません。

于 2013-03-21T13:17:51.327 に答える
0

この問題を修正するために(または回避策になる可能性があります...)、libwww-perlリポジトリにプルリクエストを送信しました。

このPRのコメントは、プロキシを介してhttpsからgithub.comに接続する単純なプログラムを示しています。このパッチを使用すると、プログラムで%ENVをいじくり回す必要はありません。

もう1つの利点は、通常のhttps_proxy設定を再利用できることです。

于 2013-11-01T18:48:22.703 に答える
0

初期の5.8と、環境変数HTTP_PROXYがプロキシ接続を適切に設定しないその他のモジュールでエラーが発生しました。

あなたのケースには、報告されたバグがここに記載されているような問題がありますhttps://bugzilla.redhat.com/show_bug.cgi?id=1094440

これを使用するより良い方法は、環境変数なしでLWPUserAgentを使用することです。

 `use LWP::UserAgent;
  $ua = LWP::UserAgent->new(); 
  $ua->proxy('https', 'connect://proxyhost.domain:3128/');`
于 2016-12-31T02:46:30.090 に答える
-1

#!/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

于 2017-07-29T16:21:23.380 に答える