HTTPS Proxy and LWP::UserAgent

后端 未结 8 2122
说谎
说谎 2020-12-17 02:18

I have read a number of threads on a number of sites and am still unable to make this work.

I have a client machine (OSX) with OpenSSL 0.9.8r running perl 5.12.4, w

相关标签:
8条回答
  • 2020-12-17 02:38

    I pretty much ran into the same problem. Here are the things that fixed it for me:

    • make sure you use Crypt::SSLeay 0.58 or lower. At least 0.64 blocked endlessly for me (as described at http://cpanforum.com/posts/13808 ), while 0.57/0.58 worked.
    • make sure Net::HTTP has been updated to at least 6.03 (to avoid https://rt.cpan.org/Public/Bug/Display.html?id=72790 )
    0 讨论(0)
  • 2020-12-17 02:47

    Why would you want "Force use of Net::SSL". Try

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

    An out put of 200 should mean that there were no errors.

    A below sample code of mine works perfectly

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

    Output-

    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
    

    With https://github.com/ the output is-

    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
    

    So having said all this. Your code version (below) should work fine-

    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);
    }
    
    0 讨论(0)
  • 2020-12-17 02:49

    Instead of using Net::SSL which does not provide much host verification (and no SNI) you can use Net::SSLGlue::LWP. This monkey-patches LWP so that https_proxy can be used with the default SSL backend IO::Socket::SSL:

    use Net::SSLGlue::LWP; # do this first
    use LWP::Simple;
    ... continue with normal LWP stuff..
    
    0 讨论(0)
  • 2020-12-17 02:49

    I know this may be a dead question, but if anyone else hits it I've another angle... I can't promise any answers, but we've faced a long-standing problem at $work in this area, but with the Squid proxy, and maybe specific to use of X509 client certs.

    The use of the Net::SSL override is part of the solution, but I would fear that WinGate could be the problem (and not something I can help with) although in our case we contact the proxy over http (not sure how LWP deals with proxy+https).

    For the record, here's an example of the precise form of code we use:

    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/");
    

    This is Perl 5.8.8 with recent CPAN installs (hence separation of L:P:https), so we have a fresh Net::HTTP.

    I was going to mention some versions of Net::HTTP are crocked, but I just realised that was my CPAN bug in Martin's reply :)

    Sorry if this doesn't add anything.

    0 讨论(0)
  • 2020-12-17 02:53

    I've sent a pull-request on libwww-perl repository to fix (or may be workaround ...) the issue.

    The comment of this PR shows a simple program that connects with https to github.com through a proxy. With this patch there's no need to mess around with %ENV in your program.

    Another advantage is that you can re-use the usual https_proxy setup.

    0 讨论(0)
  • 2020-12-17 03:01

    There has been a error in earl 5.8 and some further module where environment variable HTTP_PROXY does not appropriately sets the proxy connection.

    Your case has a issue where the bug reported is as mentioned here https://bugzilla.redhat.com/show_bug.cgi?id=1094440

    Better way to use this is without environment variable and use LWP UserAgent

     `use LWP::UserAgent;
      $ua = LWP::UserAgent->new(); 
      $ua->proxy('https', 'connect://proxyhost.domain:3128/');`
    
    0 讨论(0)
提交回复
热议问题