Perl https 代理问题
Perl https proxy problems
我似乎无法通过代理获取 https。
示例:
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;
}
结果:
500 Can't connect to aws.amazon.com:443 (timeout) at test.pl line 17.
但是如果我用 curl(还有 wget)尝试相同的代理,它工作得很好。
$ 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
Perl 版本
$ perl -MLWP -le "print(LWP->VERSION)"
6.15
$ perl --version
This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
我也尝试过使用和不使用这些:
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
我的实际目标是让 aws-scripts-mon 在代理后面的机器上工作,但它也使用 LWP::UserAgent
所以如果我让这个工作那么可能也会。
已添加信息
事实证明,如果我通过以下方式更改为 http
$ua->proxy('http', 'http://proxy:8080');
并访问 http url 然后它就可以正常工作了。问题是我需要这个才能与 https 一起使用。
来自 mon-put-instance-data.pl
的错误是:
./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.
尝试LWP::Protocol::connect found in
use LWP::UserAgent;
$ua = LWP::UserAgent->new();
$ua->proxy('https', 'connect://proxyhost.domain:3128/');
$ua->get('https://www.somesslsite.com');
$ua->proxy('https', 'https://proxy:8080');
LWP 不支持使用通过 HTTPS 访问的 HTTP 代理。但我的猜测是您的代理根本无法通过 HTTPS 进行访问,即即使它代理 HTTPS 请求(*)也可以通过 HTTP 进行访问。因此代码应该使用 http://
URL 来访问代理而不是 https://
URL:
$ua->proxy('https', 'http://proxy:8080/');
请注意,这仅适用于通常的设置,即在系统上安装 IO::Socket::SSL 并由 LWP 使用。特别是将 PERL_NET_HTTPS_SSL_SOCKET_CLASS 设置为 Net::SSL
或将 Net::SSL
显式导入程序时,过时的 Crypt::SSLeay 将在代理处理完全不同的地方使用。
(*) 即使代理将通过 HTTP 而不是 HTTPS 访问,连接仍然是加密的。这是通过客户端请求代理使用 CONNECT 方法创建到原始目标的隧道,然后在该隧道内执行端到端 SSL 来完成的。虽然也有一些代理和一些客户端也支持通过 HTTPS 访问,但这实际上意味着在客户端和代理之间建立 SSL 连接,并在此 SSL 连接内在客户端和最终目标之间建立另一个 SSL 连接,即双重加密。
我似乎无法通过代理获取 https。
示例:
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;
}
结果:
500 Can't connect to aws.amazon.com:443 (timeout) at test.pl line 17.
但是如果我用 curl(还有 wget)尝试相同的代理,它工作得很好。
$ 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
Perl 版本
$ perl -MLWP -le "print(LWP->VERSION)"
6.15
$ perl --version
This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
我也尝试过使用和不使用这些:
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
我的实际目标是让 aws-scripts-mon 在代理后面的机器上工作,但它也使用 LWP::UserAgent
所以如果我让这个工作那么可能也会。
已添加信息
事实证明,如果我通过以下方式更改为 http
$ua->proxy('http', 'http://proxy:8080');
并访问 http url 然后它就可以正常工作了。问题是我需要这个才能与 https 一起使用。
来自 mon-put-instance-data.pl
的错误是:
./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.
尝试LWP::Protocol::connect found in
use LWP::UserAgent;
$ua = LWP::UserAgent->new();
$ua->proxy('https', 'connect://proxyhost.domain:3128/');
$ua->get('https://www.somesslsite.com');
$ua->proxy('https', 'https://proxy:8080');
LWP 不支持使用通过 HTTPS 访问的 HTTP 代理。但我的猜测是您的代理根本无法通过 HTTPS 进行访问,即即使它代理 HTTPS 请求(*)也可以通过 HTTP 进行访问。因此代码应该使用 http://
URL 来访问代理而不是 https://
URL:
$ua->proxy('https', 'http://proxy:8080/');
请注意,这仅适用于通常的设置,即在系统上安装 IO::Socket::SSL 并由 LWP 使用。特别是将 PERL_NET_HTTPS_SSL_SOCKET_CLASS 设置为 Net::SSL
或将 Net::SSL
显式导入程序时,过时的 Crypt::SSLeay 将在代理处理完全不同的地方使用。
(*) 即使代理将通过 HTTP 而不是 HTTPS 访问,连接仍然是加密的。这是通过客户端请求代理使用 CONNECT 方法创建到原始目标的隧道,然后在该隧道内执行端到端 SSL 来完成的。虽然也有一些代理和一些客户端也支持通过 HTTPS 访问,但这实际上意味着在客户端和代理之间建立 SSL 连接,并在此 SSL 连接内在客户端和最终目标之间建立另一个 SSL 连接,即双重加密。