2010-06-01 231 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的域名與服務器的域名不匹配,我甚至不確定這會有所幫助。