2016-12-08 4 views
1

Je n'arrive pas à obtenir https via un proxy.Problèmes de proxy https Perl

Exemple:

require LWP::UserAgent; 

my $ua = LWP::UserAgent->new; 
$ua->timeout(10); 
$ua->proxy('https', 'https://proxy:8080'); 
# $ua->proxy(['https'], 'https://proxy:8080'); # Fails 
# $ua->env_proxy; # This also fails. 

my $response = $ua->get('https://aws.amazon.com/cloudwatch/'); 

if ($response->is_success) { 
    print $response->decoded_content; # or whatever 
} 
else { 
    die $response->status_line; 
} 

Résultat:

500 Impossible de se connecter à aws.amazon.com:443 (délai d'attente) à la ligne de test.pl 17.

Mais si j'essaie le même proxy avec curl (aussi wget) cela fonctionne très bien.

$ curl --head --proxy https://proxy:8080 https://aws.amazon.com/cloudwatch/ 
HTTP/1.1 200 Connection established 

HTTP/1.1 200 OK 
Server: Server 
Date: Thu, 08 Dec 2016 16:42:01 GMT 
Content-Type: text/html;charset=UTF-8 
Content-Length: 214187 

versions Perl

$ perl -MLWP -le "print(LWP->VERSION)" 
6.15 
$ perl --version 

This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi 

J'ai aussi essayé avec et sans ces:

export HTTPS_VERSION=3 
    export PERL_NET_HTTPS_SSL_SOCKET_CLASS="Net::SSL" 
    export PERL_LWP_ENV_PROXY=1 
    export PERL_LWP_SSL_VERIFY_HOSTNAME=0 

Mon objectif actuel est d'obtenir aws-scripts-mon travailler ici sur une machine derrière un proxy mais utilise également LWP::UserAgent donc si je fais fonctionner cela alors ça va probablement aussi.

Ajout d'information

Il se avère que si je change à http par $ua->proxy('http', 'http://proxy:8080'); et d'accéder à une URL http alors il fonctionne très bien. Le problème est que j'ai besoin de cela pour travailler avec https.

L'erreur de mon-put-instance-data.pl est:

./mon-put-instance-data.pl --mem-util --disk-space-util --disk-path=/ 

ERROR: Failed to call CloudWatch: HTTP 500. Message: Can't connect to monitoring.eu-west-1.amazonaws.com:443 (timeout) 

LWP::Protocol::https::Socket: connect: timeout at /usr/local/share/perl5/LWP/Protocol/http.pm line 47. 
+0

Pourquoi avez-vous 'require' au lieu de' use'? Pourquoi n'avez-vous * pas * d'utiliser «strict» et «utilisez des avertissements» en haut de votre programme? Ce sont * essentiels * pour tout programme Perl. – Borodin

+0

Je vois ce que vous voulez dire, mais j'ai simplement fait un rapide copier-coller depuis le CPAN et voici comment l'exemple d'utilisation de LWP: Useragent a l'air [là] (http://search.cpan.org/~ether/libwww-perl-6.15 /lib/LWP/UserAgent.pm). –

Répondre

3

Essayez LWP::Protocol::connect trouvé dans https://stackoverflow.com/a/17787133/44620

use LWP::UserAgent; 

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

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

Désolé. En regardant les rapports de bogue, il semble y avoir un bug ouvert concernant https via un proxy: https://rt.cpan.org/Public/Bug/Display.html?id=95671 –

+1

Cependant, dans cette réponse (http://stackoverflow.com/a/17787133/6193608) quelqu'un semble avoir trouvé une solution de contournement. Le message est daté de 2013, mais cela pourrait valoir la peine d'essayer. –

+0

Cela a fonctionné! Merci! –

1
$ua->proxy('https', 'https://proxy:8080'); 

LWP ne supporte pas l'utilisation de serveurs proxy HTTP qui sont accessibles via HTTPS . Mais je suppose que votre proxy n'a pas du tout accès à HTTPS, c'est-à-dire qu'il est accédé avec HTTP même s'il utilise des requêtes HTTPS (*). Ainsi, le code devrait plutôt utiliser une URL http:// pour accéder au proxy et non une URL https://:

$ua->proxy('https', 'http://proxy:8080/'); 

Notez que cela ne fonctionne que dans la configuration habituelle, à savoir avec IO :: Socket :: SSL installé sur le système et utilisé par LWP. En particulier, en définissant PERL_NET_HTTPS_SSL_SOCKET_CLASS sur Net::SSL ou en important explicitement Net::SSL dans le programme, le Crypt::SSLeay obsolète sera utilisé lorsque la gestion des proxy est complètement différente. (*) Même si le proxy sera accédé par HTTP et non par HTTPS, la connexion est toujours cryptée. Cela est effectué par le client demandant au proxy de créer un tunnel vers la cible d'origine à l'aide de la méthode CONNECT, puis de faire du SSL de bout en bout à l'intérieur de ce tunnel. Bien qu'il existe des proxies et des clients supportant l'accès par HTTPS, cela signifierait essentiellement de construire une connexion SSL entre le client et le proxy et une autre connexion SSL entre le client et la cible finale, c'est-à-dire le double cryptage.

+0

L'OP utilise LWP 6.15 et dit '$ ua-> proxy ('https', 'http: // proxyhost: proxyport /');' ne fonctionnait pas. – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot: en fait, l'OP a déclaré que l'utilisation de 'https: //' pour accéder au proxy ne fonctionnait pas et exactement cela (utilisation de 'https: //' au lieu de 'http: //' pour accéder au proxy) était le vrai problème. Merci de m'avoir indiqué la version que l'OP utilise puisque j'ai manqué ce détail. –

+0

Votre supposition semble être fausse. J'ai essayé '$ ua-> proxy ('https', 'https: // proxy: 8080');' et j'ai toujours '500 Impossible de se connecter à aws.amazon.com:443 (timeout) au test. pl ligne 16. ' Ce que vous suggérez aussi ne semble pas expliquer pourquoi' curl --head --proxy https: // proxy: 8080 https: // aws.amazon.com/cloudwatch/'fonctionne. –