2011-11-06 10 views
7

मेरा लक्षण यह है कि मैं एलडब्ल्यूपी के साथ HTTPS अनुरोधों के साथ प्रॉक्सी का उपयोग नहीं कर सकता। यह एक आम समस्या प्रतीत होती है, और Google पर संकेत और here सभी क्रिप्ट :: SSLeay द्वारा उपयोग के लिए HTTPS_PROXY पर्यावरण चर सेट करने के लिए कार्य-आसपास सुझाते हैं।मैं एचटीटीपीएस अनुरोधों के लिए क्रिप्ट :: एसएसएलई का उपयोग करने के लिए एलडब्ल्यूपी को कैसे मजबूर करूं?

मेरी विशिष्ट समस्या यह प्रतीत होती है कि LWP :: प्रोटोकॉल :: https क्रिप्ट :: SSLeay के बजाय IO :: सॉकेट :: एसएसएल लोड कर रहा है। मैं क्रिप्ट :: एसएसएलई के उपयोग को इसके बजाय कैसे मजबूर कर सकता हूं?

मेरे कोड:

#!/usr/bin/perl 

use strict; 
use warnings; 
$ENV{HTTPS_PROXY} = 'http://10.0.3.1:3128'; 
use LWP::UserAgent; 
my $ua = LWP::UserAgent->new(); 
my $req = HTTP::Request->new('GET','https://www.meritrustcu.org/'); 
my $res = $ua->request($req); 
print "$_\n" for grep { $_ =~ /SSL/ } keys %INC; 

और यह उत्पादन है, दिखा रहा है कि क्रिप्ट :: SSLeay इस्तेमाल नहीं किया जा रहा है:

Net/SSLeay.pm 
IO/Socket/SSL.pm 
/usr/lib/perl5/auto/Net/SSLeay/autosplit.ix 
/usr/lib/perl5/auto/Net/SSLeay/set_proxy.al 
/usr/lib/perl5/auto/Net/SSLeay/randomize.al 

सीधे शब्दों में जोड़ने के लिए कोई स्पष्ट use Crypt::SSLeay मेरी स्क्रिप्ट के लिए अप्रभावी साबित कर दी है। यह मॉड्यूल लोड करता है, लेकिन यह आईओ :: सॉकेट :: एसएसएल लोड करना जारी रखता है, और इसे HTTPS अनुरोधों के लिए उपयोग करता है।

उत्तर

9

इस प्रयास करें:

use strict; 
use warnings; 

use Net::SSL(); # From Crypt-SSLeay 
BEGIN { 
    $Net::HTTPS::SSL_SOCKET_CLASS = "Net::SSL"; # Force use of Net::SSL 
    $ENV{HTTPS_PROXY} = 'http://10.0.3.1:3128'; 
} 

use LWP::UserAgent; 
my $ua = LWP::UserAgent->new(); 
my $req = HTTP::Request->new('GET','https://www.meritrustcu.org/'); 
my $res = $ua->request($req); 
print "$_\n" for grep { $_ =~ /SSL/ } keys %INC; 

मैं एक उपयुक्त प्रॉक्सी की जरूरत नहीं है, तो मैं इसे अपने आप को प्रयास नहीं किया है।

+1

बिल्कुल सही, धन्यवाद! ऐसा करने से एलडब्ल्यूपी आईओ :: सॉकेट :: एसएसएल को डिफ़ॉल्ट कारण बताता है, जैसा कि आपने अपने [अपने प्रश्न] में स्पर्श किया था (http://stackoverflow.com/questions/74358/how-can-i-get- lwp-to-validate-ssl-server-certificates): 'नेट :: एसएसएल क्रिप्ट-एसएसएलई से होस्टनाम सत्यापित नहीं कर सकता; या तो आईओ :: सॉकेट :: एसएसएल स्थापित करें या PERL_LWP_SSL_VERIFY_HOSTNAME पर्यावरण चर को 0' – Flimzy

+1

पर सेट करके सत्यापन बंद करें LWP 6 ने मेजबान नामों को सत्यापित करने की नीति को बदल दिया है। यदि आप कर सकते हैं, Crypt :: SSLeay के अलावा कुछ और उपयोग करें, जिसमें समर्पित डेवलपर नहीं है (हालांकि सिनन इसे संकलित करने में मदद कर रहा है)। –

+0

@briandfoy: यदि मैं प्रॉक्सी के साथ IO :: सॉकेट :: एसएसएल (या कोई अन्य विकल्प - क्या अन्य विकल्प हैं?) का उपयोग करने का तरीका समझ सकता हूं, तो मैं ऐसा करूँगा। – Flimzy

1

जीई में हमारे प्रॉक्सी के साथ काम करने के लिए मैंने एलडब्लूपी और एसओएपी :: लाइट प्राप्त करने के लिए यही किया। यह सीपीएएन, गूगल इत्यादि पर बहुत खुदाई के बाद था। अंततः मैंने क्रिप्ट :: एसएसएलई पैकेज में नेट स्क्रिप्ट नामक टेस्ट स्क्रिप्ट चलाने के बाद इसे निकाला और यह प्रॉक्सी से जुड़ने में सक्षम था। कुंजी क्रिप्ट :: एसएसएलईई को उपरोक्त वर्णित नेट :: एसएसएल का उपयोग करने के लिए मजबूर कर रही है। हालांकि यह सीपीएएन पर बहुत अच्छी तरह से प्रलेखित नहीं है।

use LWP::UserAgent; 

# override HTTPS setting in LWP to work with a proxy 
$ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = "Net::SSL"; 
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; 
$ENV{HTTPS_PROXY}    = 'http-proxy.ae.ge.com:80'; 
$ENV{HTTPS_PROXY_USERNAME}  = 'username'; 
$ENV{HTTPS_PROXY_PASSWORD}  = 'password'; 

$ua = new LWP::UserAgent; 

# make a https request 
my $req = HTTP::Request->new(GET => 'https://mail.google.com/'); 
my $res = $ua->request($req); 
print $res->as_string; 
संबंधित मुद्दे

 संबंधित मुद्दे