好的...让我们看看这是否更清楚。

我正在通过 LWP::UserAgent 将 XML 文档发布到远程第三方服务器。

他们之前通过 CPanel 和 Putty 命令行“定位”调用向我发送了他们的 .crt 文件,我将其安装在我的服务器上,并验证了他们的地址和它们存在的事实。证书在那里。

我确保安装了 LWP::Protocol::https 和所有其他必要的 Perl 模组,包括 Mozilla::CA、Crypt::SSLeay 等。

当我运行脚本时,出现以下错误:

An Error Occurred

500 Can't connect to shortURL:port (certificate verify failed) 500 Can't connect to shortURL:port (certificate verify failed) Content-Type: text/plain Client-Date: Wed, 25 Jan 2012 17:53:36 GMT Client-Warning: Internal response Can't connect to shortURL:port (certificate verify failed) LWP::Protocol::https::Socket: SSL connect attempt failed with unknown errorerror:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at /usr/lib/perl5/site_perl/5.8.8/LWP/Protocol/http.pm line 51.

调用代码如下:

sub ConsumerInfo { 
my $cid = shift; 
 
my $response = undef; 
my $sendXML = &Create_ConsumerInfo_Request($cid); 
if ($sendXML) { 
    &DoXMLUpload($sendXML); 
 
    my $browser = LWP::UserAgent->new(agent => 'site_perl', 
        ssl_opts => { 
            verify_hostname => 1, 
            SSL_ca_path => '/home/<mysite>/ssl/certs/', 
        },); 
    $browser->credentials('shortURL:port','realm','username'=>'password'); 
    $response = $browser->request(POST 'longURL', 
        Content_Type => 'text/xml', 
        Content => $sendXML); 
    print "Content-type:text/html\n\n"; 
    print $response->error_as_HTML unless $response->is_success; 
    print $response->as_string; 
} else { 
    &ErrorMsg("No XML Code Was Found."); 
    exit;    
} 
# =============================================================== 
# Need to insert parser in here to convert this into an array. 
# =============================================================== 
return $response; 
} 

有什么想法吗?我在这里没有想法了。 :(

请您参考如下方法:

rm -f /home/site/ssl/certs/* 
 
wget --no-check-certificate \ 
             -O /home/site/ssl/certs/DigiCertHighAssuranceCA-3.crt.pem \ 
    https://www.digicert.com/CACerts/DigiCertHighAssuranceCA-3.crt 
 
wget --no-check-certificate \ 
              -O /home/site/ssl/certs/DigiCertHighAssuranceEVRootCA.crt.pem \ 
    https://www.digicert.com/testroot/DigiCertHighAssuranceEVRootCA.crt 
 
c_rehash /home/site/ssl/certs/ 
 
echo -n | openssl s_client -connect previewtest.clverify.com:443 -CApath /home/site/ssl/certs 

倒数第三行说现在验证返回码:0 (ok)

echo -n | HTTPS_CA_DIR=/home/site/ssl/certs lwp-request -m POST https://previewtest.clverify.com/webservice/exec 

响应现在经过加密步骤并返回 Tomcat 错误消息。

如图所示,带有 LWP 和 SSL_ca_path 的 Perl 代码也可以工作,至少是加密部分。


大体提示:坐下来阅读 OpenSSL 文档,也许还有一两本相关书籍,并进行全面的 RTFM 学习基本概念。如果你只是继续实现它而不了解它的真正作用,那么有一天有人 MITM 会传输你的信息而你甚至没有注意到有什么不对劲,然后你的头就会上线。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!