2012-10-02 16 views
8

मैं PHP/curl से पर्ल और एलडब्ल्यूपी :: UserAgent पर एक एप्लिकेशन पोर्ट कर रहा हूं। मुझे किसी वेब सर्वर पर POST अनुरोध करने और क्लाइंट प्रमाणपत्र और कुंजी फ़ाइल प्रदान करने की आवश्यकता है। PHP कोड मैं दोहराने की कोशिश कर रहा हूँ यह है:एसएसएल और क्लाइंट प्रमाण पत्र के साथ एलडब्ल्यूपी का उपयोग

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_SSLCERT, "/path/to/certificate.pem"); 
curl_setopt($ch, CURLOPT_SSLKEY, "/path/to/private.key"); 
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, "secretpassword"); 

और यहाँ मेरी पर्ल कोड है:

my $ua = LWP::UserAgent->new(); 
$ua->ssl_opts(
    SSL_verify_mode => 0, 
    SSL_cert_file => '/path/to/certificate.pem', 
    SSL_key_file => "/path/to/private.key", 
    SSL_passwd_cb => sub { return "secretpassword"; } 
); 

PHP कोड सफलतापूर्वक सर्वर से कनेक्ट लेकिन पर्ल कोड के साथ विफल:

एसएसएल त्रुटि त्रुटि त्रुटि: 140 9 4410: एसएसएल दिनचर्या: एसएसएल 3_READ_BYTES: एसएसएलवी 3 अलर्ट हैंडशेक विफलता

मैं यह नहीं समझ सकता कि मैं क्या खो रहा हूं।

+0

क्या 'private.key' (PHP) और' private.pem' (पर्ल) पोर्टिंग का एक टाइपो या हिस्सा है? – amon

+2

[ssl_opts] (https://metacpan.org/module/LWP::UserAgent#ATTRIBUTES) पर एकाधिक तर्कों को पास करना दस्तावेज नहीं है। सुरक्षित होने के लिए, या तो कई बार ssl_opts को कॉल करें या उन्हें कन्स्ट्रक्टर में पास करें। मुझे लगता है कि यह काम करने के लिए होता है, लेकिन बेहतर सुरक्षित है। आप [बग/गायब सुविधा के रूप में इसकी रिपोर्ट भी कर सकते हैं] (https://rt.cpan.org/Public/Bug/Report.html?Queue=libwww-perl)। – Schwern

+0

जब मैं अपना कोड अस्पष्ट करता था तो यह सिर्फ एक टाइपो था। यह दोनों के लिए निजी.की होना चाहिए। ध्यान देने के लिए धन्यवाद लेकिन यह समस्या नहीं है। अभी भी सहायता चाहिए! :) – kent

उत्तर

2
sub send_command(){ 
     my $command = shift; 
     my $parser = XML::LibXML->new('1.0','utf-8'); 

     print color ("on_yellow"), "SEND: ", $command, color ("reset"), "\n"; 

     # Create a request 
     my $req = HTTP::Request->new(GET => $Gateway.$command); 

     # Pass request to the user agent and get a response back 
     my $res; 
     eval { 
       my $ua; 
       local $SIG{'__DIE__'}; 
       $ua = LWP::UserAgent->new(); # или 
       $ua->ssl_opts(#$key => $value 
        SSL_version   => 'SSLv3', 
        SSL_ca_file   => '/ca.pem', 
        #SSL_passwd_cb  => sub { return "xxxxx\n"; }, 
        SSL_cert_file  => '/test_test_cert.pem', 
        SSL_key_file  => '/test_privkey_nopassword.pem', 
       ); # ssl_opts => { verify_hostname => 0 } 
       $ua->agent("xxxxxx xxxx_tester.pl/0.1 "); 
       $res = $ua->request($req); 

     }; 
     warn [email protected] if [email protected]; 
     # Check the outcome of the response 
     if ($res->is_success) { 
       open xxxLOG, ">> $dir/XXXX_tester.log"; 
       my $without_lf = $res->content; 
       $without_lf =~ s/(\r|\n)//gm; 
       print PAYLOG $without_lf,"\n"; 
       close PAYLOG; 
     } 
     else { 
       return $res->status_line; 
     }  
     print color ("on_blue"), "RESPONSE: ", color ("reset"), respcode_color($res->content), color ("reset"),"\n\n"; 
     return $res->content; 
} 
3

मेरी समस्या हल करने के ऊपर emazep से उत्तर। मैं एक्सपीएस के माध्यम से अपनी दर सेवा से कनेक्ट करने के लिए यूपीएस से नमूना पर्ल कोड का उपयोग कर रहा हूं। मेरे परीक्षणों से, यह किसी भी समय काम करेगा LWP :: UserAgent को उन तर्कों के बिना बुलाया जा रहा है जिन्हें आप सीधे नियंत्रित कर सकते हैं, जिससे आप कुछ अन्य मॉड्यूल का उपयोग कर रहे हैं जो आपके लिए एलडब्लूपी को कॉल करता है। बस Net :: एसएसएल (पहले से ही LWP का इस्तेमाल किया है जो कुछ भी संकुल के अलावा) और सेट में कुछ वातावरण चर का उपयोग करें:

... 
use Net::SSL; 
$ENV{HTTPS_VERSION} = 3; 
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; 
my $browser = LWP::UserAgent->new(); 
... 

यह है कि! आपको $ ENV {PERL_LWP_SSL_CA_FILE} के साथ अपने सर्वर के रूट प्रमाणपत्र के पथ को निर्दिष्ट करने की आवश्यकता भी नहीं होनी चाहिए।

1

वास्तव में यह एक गन्दा बिट है। आपके सेटअप के आधार पर LWP :: UserAgent SSL कनेक्शन को संभालने के लिए (कम से कम) दो SSL मॉड्यूल का उपयोग कर सकता है।

  • आईओ :: सॉकेट :: एसएसएल
  • Net :: एसएसएल

पहले एक LWP :: UserAgent के नए संस्करण के लिए डिफ़ॉल्ट होना चाहिए। आप परीक्षण कर सकते हैं जो इनमें से प्रत्येक मॉड्यूल के लिए एक टर्मिनल में मानक आदेश चलाकर स्थापित कर रहे हैं:

perl -e 'use <module>;' 

आईओ :: सॉकेट :: SSL आपके उदाहरण के रूप में ssl_opts साथ एसएसएल विन्यास की आवश्यकता है।

नेट :: एसएसएल को पर्यावरण चर में एसएसएल कॉन्फ़िगरेशन की आवश्यकता है जैसे कि Goddogsrunnings उत्तर में।

व्यक्तिगत रूप से मैं दूसरी श्रेणी में पड़ता हूं और Crypt::SSLeay page से अच्छी प्रेरणा मिली है। विशेष रूप से "क्लाइंट सर्टिफिकेट समर्थन" नामक अनुभाग।

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

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