2010-06-01 234 views
6

我遇到了perl screenscraper到HTTPS站点的问题。 在调试时,我跑了以下内容:perl客户端 - SSL-警告:未验证对等证书

print $res->headers_as_string; 

,并在输出中,我有以下行:

Client-SSL-Warning: Peer certificate not verified 

有没有一种方法可以让我自动接受此证书,或者是不问题?

#!/usr/bin/perl 
use LWP::UserAgent; 
use Crypt::SSLeay::CTX; 
use Crypt::SSLeay::Conn; 
use Crypt::SSLeay::X509; 
use LWP::Simple qw(get); 

my $ua = LWP::UserAgent->new; 
my $req = HTTP::Request->new(GET => 'https://vzw-cat.sun4.lightsurf.net/vzwcampaignadmin/'); 
my $res = $ua->request($req); 

print $res->headers_as_string; 

输出:

Cache-Control: no-cache 
Connection: close 
Date: Tue, 01 Jun 2010 19:28:08 GMT 
Pragma: No-cache 
Server: Apache 
Content-Type: text/html 
Expires: Wed, 31 Dec 1969 16:00:00 PST 
Client-Date: Tue, 01 Jun 2010 19:28:09 GMT 
Client-Peer: 64.152.68.114:443 
Client-Response-Num: 1 
Client-SSL-Cert-Issuer: /O=VeriSign Trust Network/OU=VeriSign, Inc./OU=VeriSign International Server CA - Class 3/OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign 
Client-SSL-Cert-Subject: /C=US/ST=Massachusetts/L=Boston/O=verizon wireless/OU=TERMS OF USE AT WWW.VERISIGN.COM/RPA (C)00/CN=PSMSADMIN.VZW.COM 
Client-SSL-Cipher: DHE-RSA-AES256-SHA 
Client-SSL-Warning: Peer certificate not verified 
Client-Transfer-Encoding: chunked 
Link: <css/vtext_style.css>; rel="stylesheet"; type="text/css" 
Set-Cookie: JSESSIONID=DE6C99EA2F3DD1D4DF31456B94F16C90.vz3; Path=/vzwcampaignadmin; Secure 
Title: Verizon Wireless - Campaign Administrator 

UPDATE: 我添加

$ENV{HTTPS_CA_FILE} = 'certs/PSMSADMIN.VZW.COM'; 
$ENV{HTTPS_CA_DIR} = 'certs/'; 

如下建议。我也打开调试:

$ENV{HTTPS_DEBUG} = 1; 

这里是我的输出:

SSL_connect:before/connect initialization 
SSL_connect:SSLv3 write client hello A 
SSL_connect:SSLv3 read server hello A 
SSL3 alert write:fatal:bad certificate 
SSL_connect:error in SSLv3 read server certificate B 
SSL_connect:before/connect initialization 
SSL_connect:SSLv2 write client hello A 
SSL_connect:error in SSLv2 read server hello B 
content: 500 SSL negotiation failed: error:1407E086:SSL routines:SSL2_SET_CERTIFICATE:certificate verify failed 

我试图忽略失败,但问题是,这是页面上的唯一的事情了,所以没有登录形式或任何东西。

+0

你可以发布你的输出吗?我得到了200行,我认为是正确的文件。是的,标题有一个警告,但你能澄清这是如何不利地影响你的程序的行为? – jasonmp85 2010-06-01 19:13:04

+0

问题是我无法登录。提交凭证后,它会返回到登录页面。 – Jeremey 2010-06-01 19:32:58

+0

您可能想要启用HTTP调试级别。我不确定这是否是SSL问题。你能输出状态码和身体吗?我显然没有证书来测试这个:-D – jasonmp85 2010-06-01 19:47:13

回答

4

就我所知,这只是一个警告。该网站上的证书与域不匹配,所以perl(正确)抱怨它。如果你真的对等证书验证转,像这样:

# CA cert peer verification 
$ENV{HTTPS_CA_FILE} = 'certs/ca-bundle.crt'; 
$ENV{HTTPS_CA_DIR} = 'certs/'; 

你会得到这个作为你的输出:

Content-Type: text/plain 
Client-Date: Tue, 01 Jun 2010 19:32:51 GMT 
Client-Warning: Internal response 
500 SSL negotiation failed: error:1407E086:SSL 
     routines:SSL2_SET_CERTIFICATE:certificate verify failed 
Content-Type: text/plain 
Client-Date: Tue, 01 Jun 2010 19:32:51 GMT 
Client-Warning: Internal response 

有一个名为Net::SSLget_peer_verify(其中Crypt::SSLeay提供)方法返回是否或者不需要同行验证。我相信它被添加了in 2001左右为了使这个消息被隐藏。 2002年的This patch声称在不需要同行验证时关闭警告,但我认为它从未应用过。

因此,简而言之,除非您打算进行验证,否则您可能会忽略该警告,在这种情况下,我会说将根证书添加到您的CA_DIRCA_FILE。但是由于cert的域名与服务器的域名不匹配,我甚至不确定这会有所帮助。