使用perl脚本的HTTP Post在使用代理时返回503服务不可用
使用perl脚本的HTTP Post在使用代理时返回503服务不可用使用perl脚本的HTTP Post在使用代理时返回503服务不可用,perl,proxy,http-post,http-proxy,Perl,Proxy,Http Post,Http Proxy,使用perl脚本的HTTP Post在使用代理时返回503服务不可用 #!/usr/bin/perl -w use LWP::UserAgent; my $ua = LWP::UserAgent->new; $ua->timeout( 20 ); my $server_endpoint = "https://mytest.test.com/events"; $ua->proxy('https' , "http://1.2.3.4:808
#!/usr/bin/perl -w
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
$ua->timeout( 20 );
my $server_endpoint = "https://mytest.test.com/events";
$ua->proxy('https' , "http://1.2.3.4:8088");
my $req = HTTP::Request->new(POST => $server_endpoint);
$req->header('content-type' => 'application/json');
$req->authorization_basic('user1', 'user1pass123!');
print "Posting URL: $server_endpoint \n";
# add POST data to HTTP request body
my $post_data = '{"events":[{"signature":"my_test_box:application:Network","source_id":"1.2.3.4","manager":"my_manager_srv","source":"my_test_box_2","class":"application","type":"Network","severity":3,"description":"high network utilization in application A"}]}';
$req->content($post_data);
my $resp = $ua->request($req);
if ($resp->is_success)
{
my $message = $resp->decoded_content;
print "Received reply: $message\n";
print "HTTP POST code: ", $resp->code, "\n";
print "HTTP POST message: ", $resp->message, "\n";
}
else {
print "HTTP POST error code: ", $resp->code, "\n";
print "HTTP POST error message: ", $resp->message, "\n";
#curl -u user1:user1pass123! mytest.test.com/events -H "Content-Type: application/json" -X POST --data '{"events":[{"signature":"my_test_box:application:Network","source_id":"1.2.3.4","manager":"my_manager_srv","source":"my_test_box_2","class":"application","type":"Network","severity":3,"description":"high network utilization in application A"}]}'; -v -x http://1.2.3.4:8088
* About to connect() to proxy 1.2.3.4 port 8088 (#0)
* Trying 1.2.3.4... connected
* Connected to 1.2.3.4 (1.2.3.4) port 8088 (#0)
* Establish HTTP proxy tunnel to mytest.test.com:443
* Server auth using Basic with user 'user1'
> CONNECT mytest.test.com:443 HTTP/1.1
> Host: mytest.test.com:443
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Proxy-Connection: Keep-Alive
> Content-Type: application/json
> < HTTP/1.1 200 Connection established <
* Proxy replied OK to CONNECT request
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt CApath: none
* Server certificate:
* subject: CN=*.test.com,OU=Domain Control Validated
* start date: Nov 01 22:33:00 2017 GMT
* expire date: Nov 01 22:33:00 2018 GMT
* common name: .test.com
* issuer: CN=Go Daddy Secure Certificate Authority - G2,OU=certs.godaddy.com/repository/,O="GoDaddy.com, Inc.",L=Scottsdale,ST=Arizona,C=US
* Server auth using Basic with user 'user1' > POST /events HTTP/1.1
> Authorization: Basic xxxxxxxxxxxxxxxx
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: mytest.test.com
> Accept: */
> Content-Type: application/json
> Content-Length: 325
> < HTTP/1.1 200 OK < Date: Fri, 19 Jan 2018 08:38:23 GMT < Content-Length: 101 < Connection: keep-alive
< Server: nginx
< X-Frame-Options: SAMEORIGIN
< Strict-Transport-Security: max-age=63072000; includeSubDomains; always
< {"response"{"processed":1,"cached":0,"received":1},"success":true,"message":"Processed 1 event(s)"}
* Connection #0 to host 1.2.3.4 left intact
* Closing connection #0
#curl-u user1:user1pass123!mytest.test.com/events-H“内容类型:application/json”-X POST--data'{“events”:[{“signature”:“我的测试盒:应用程序:网络”来源id:“1.2.3.4”,“经理”:“我的经理”er_srv,“来源”:“我的_测试箱2,“等级”:“应用程序”、“类型”":"网络服务器y“:3,“描述”:”应用程序A“}]}”中的高网络利用率-v-xhttp://1.2.3.4:8088
*即将连接()到代理1.2.3.4端口8088(#0)
*正在尝试1.2.3.4。。。有联系的
*连接到1.2.3.4(1.2.3.4)端口8088(#0)
*建立到mytest.test.com的HTTP代理隧道:443
*对用户“user1”使用Basic进行服务器身份验证
>连接mytest.test.com:443http/1.1
>主持人:mytest.test.com:443
>用户代理:curl/7.19.7(x86_64-redhat-linux-gnu)libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
>代理连接:保持活动状态
>内容类型:application/json
>POST/events HTTP/1.1”进行服务器身份验证
>授权:基本XXXXXXXXXX
>用户代理:curl/7.19.7(x86_64-redhat-linux-gnu)libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
>主持人:mytest.test.com
>接受:**/
>内容类型:application/json
>内容长度:325
>
很难分析问题,因为您使用的是一个有9年历史(且长期过时)的软件堆栈。但是考虑到您在评论中给出的响应,我怀疑不是您的代码有SSL问题,而是您的代理有SSL问题。请从您得到的HTTP响应正文中引用:
SSL证书验证错误(SSL_失败).这通常是由未配置为接受SSL连接的网站引起的,但可能是因为代理不信任该网站的证书颁发机构 假设您在LWP中存在此问题,但没有curl,则此响应可能是由于这些客户端构造代理请求的方式不同。如果您的安装程序使用IO::Socket::SSL作为后端,则旧版本的LWP将无法构造可能导致此故障的正确代理请求(在2014年的LWP 6.06中修复)。如果您使用Crypt::SSLeay,则此旧版本中缺少对SNI的支持可能是问题所在(在2012年的0.59_3中修复)
无论如何,我真的建议您远离旧的、不受支持的、可能不安全的软件堆栈。如果您使用当前的堆栈,问题可能会消失。由于您使用的Perl版本相当旧,您实际上无法以这种方式设置HTTPS代理。您必须通过环境变量在低级别上进行设置
$ENV{HTTPS_PROXY}='http://1.2.3.4:8088';
请注意,您必须在创建UserAgent之前执行
除此之外,您应该为SSL连接导入模块IO::Socket::SSL
(Net::SSL
可能更可取,但对于那么旧的Perl版本,它显然不可用)。您可以导入设置调试级别(从1到4,我建议3)的模块
总而言之,这应该是代码的开始
#!/usr/bin/perl -w
use LWP::UserAgent;
use IO::Socket::SSL qw(debug3);
$ENV{HTTPS_PROXY}='http://1.2.3.4:8088';
$ENV{HTTPS_DEBUG}=1;
my $ua = LWP::UserAgent->new;
...
注意:您还应该检查使用Perl获得的响应头,而不是curl。添加
print$resp->headers\u as\u string()
如果$resp->is_success
为假。请确保在使用https URL代理时至少使用了LWP版本6.06,因为旧版本的支持已被破坏。此外,请提供您正在使用的LWP版本和完整响应,而不仅仅是响应代码。#perl-MLWP-le“打印”(LWP->VERSION)“5.833 SSL证书验证错误SSL证书验证错误(SSL\u失败)
无法与网站建立安全SSL会话:”“。这些评论的可读性很差-请编辑您的问题,以便以一种格式良好的可读方式提供这些附加详细信息。此外,“使用相同的CA使用CURL,数据发布工作正常”-你怎么知道?你没有在Perl程序中指定CA存储。再次-编辑问题以提供此类信息,不要将所有内容粘贴到注释中。并且,仅仅因为你没有在这两种情况下指定CA存储并不意味着使用相同的CA存储。默认值可能不同。是的,你是对的。让我检查代理配置由于同一脚本正在将数据成功发布到其他URL接收器,因此LWP不应存在问题