2016-09-06 5 views
2

Я хочу запросить URL-адрес через прокси-сервер HTTPS с помощью модуля LWP :: UserAgent perl. Существует много ссылок на это, но ничто не могло помочь мне заставить его работать.Perl HTTPS через прокси-сервер с использованием LWP :: UserAgent

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

BEGIN { 
    $ENV{HTTPS_PROXY} = 'https://<IP>:<PORT>'; 
    $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; 
    $ENV{HTTPS_PROXY_USERNAME} = '<API_KEY>'; 
    $ENV{HTTPS_PROXY_PASSWORD} = ''; 
    $ENV{HTTPS_DEBUG} = 1; #Add debug output 
} 

my $ua = LWP::UserAgent->new(ssl_opts => {verify_hostname => 0}, SSL_version => 'SSLv3', allowed_protocols => ['https', 'http']); 
$ua->proxy(['https', 'http'], 'https://<IP>:<PORT>'); 
my $req = HTTP::Request->new('GET','https://<DOMAIN_URL>'); 
print STDERR Dumper($ua); 
my $response = $ua->request($req); 
print $response->code ."\n"; 
print STDERR Dumper($response); 

Я получаю эту ошибку:

SSL connect attempt failed error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol at /home/user/project/local/lib/perl5/LWP/Protocol/http.pm line 51.

Несмотря мне указания allowed_protocols в LWP, HTTPS схема в прокси и схемы ссылок, в протокол HTTPS, он по-прежнему идет в LWP :: Протокол HTTP :: выше и а не LWP :: Protocol :: HTTPS.

Я также проверил, что версия LWP :: Протокол :: HTTPS 6.06, который является таким же, как LWP :: UserAgent (который был упомянут в одном из форумов)

+0

Исправлено! Любые предложения для меня, чтобы опробовать –

+0

Не совсем я боюсь. Если вы можете предоставить сервер для тестирования, я могу поиграть. Но у меня в голове нет идей. – simbabque

+0

Его личное облако прокси с учетными данными .. –

ответ

2

Это работает для меня:

use LWP::UserAgent; 

$ua = LWP::UserAgent->new(); 
$ua->proxy('https', 'connect://<USER>:<PSWD>@<IP>:<PORT>/'); 

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

HTTPS Proxy and LWP::UserAgent

Примечание: учетные среды (HTTPS_PROXY_USERNAME) не работал для меня. Мне нужно было ввести его в URL-адрес, как указано выше.

+1

Схема 'connect: //' работает только при наличии 'LWP :: Protocol :: connect'. Он также работает с версией LWP до 6.06. Но с версиями, начиная с 6.06, я рекомендую использовать встроенный прокси-сервер, потому что вам не нужно устанавливать дополнительный модуль. –

2

Правильная установка с последними версиями LWP (начиная с версии 6.06, который у вас есть), чтобы просто использовать тот же синтаксис, как и в других приложениях вместе с proxy функции:

my $ua = LWP::UserAgent->new; 
$ua->proxy(https => 'http://user:[email protected]'); 
$ua->get('https://server'); 

В качестве альтернативы можно установить переменная среды https_proxy с тем же значением, то есть http://user:[email protected].

До 6.06 поддержка прокси была нарушена, по крайней мере, при использовании вместе с IO :: Socket :: SSL (по умолчанию с версии 6.0). Синтаксис, который у вас есть в вашем вопросе, касается старого бэкэнда Crypt::SSLeay, который больше не рекомендуется, потому что он не проверяет сертификаты должным образом.

+1

Согласен. OP, см. [Вам нужен Crypt :: SSLeay?] (Https://metacpan.org/pod/Crypt::SSLeay#DO-YOU-NEED-Crypt::SSLeay) и [Действительно ли ваш код зависит от Crypt :: SSLeay?] (https://www.nu42.com/2014/04/does-your-code-really-depend-on.html). –