使用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

使用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: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";
  • 通过相同的代理和相同的脚本发布到任何其他数据接收方URL都可以。(在代理上配置URL以允许通信)
  • 能够使用curl命令将数据发布到:…但是,使用此脚本时返回503服务不可用 3.在我的本地机器上使用相同的脚本测试相同的URL,无需代理,发布效果良好
  • 非常感谢您的帮助 谢谢

    在此处添加命令curl和输出:

    #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_manag‌​er_srv","source":"my‌​_test_box_2","class"‌​:"application","type‌​":"Network","severit‌​y":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":"Pro‌cessed 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不应存在问题