2008-12-03 94 views
9

我想知道是否有可能強制LWP :: UserAgent接受單個知名服務器的過期SSL證書。這個問題在兩者之間的Squid代理有點複雜。我可以強制LWP :: UserAgent接受過期的SSL證書嗎?

我去儘可能建立一個調試環境,如:

use warnings; 
use strict; 
use Carp; 
use LWP::UserAgent; 
use LWP::Debug qw(+); 
use HTTP::Cookies; 

my $proxy = 'http://proxy.example.net:8118'; 
my $cookie_jar = HTTP::Cookies->new(file => 'cookies.tmp'); 
my $agent = LWP::UserAgent->new; 
$agent->proxy([ 'http' ], $proxy); 
$agent->cookie_jar($cookie_jar); 

$ENV{HTTPS_PROXY} = $proxy; 
$ENV{HTTPS_DEBUG} = 1; 
$ENV{HTTPS_VERSION} = 3; 
$ENV{HTTPS_CA_DIR} = '/etc/ssl/certs'; 
$ENV{HTTPS_CA_FILE} = '/etc/ssl/certs/ca-certificates.crt'; 

$agent->get('https://www.example.com/'); 

exit; 

好在這個問題最終被固定在遠程服務器上,我能夠拿出自己的解決方案之前,但我想能夠有選擇地繞過問題,如果它再次出現(底層服務已被打亂了幾個小時,然後才被採取行動)。

如果存在這樣的解決方案,我寧願在基於Crypt :: SSLeay或openSSL實現的LWP :: UserAgent級別上使用一個解決方案,因爲我寧願不放鬆其他不相關應用程序的安全性。當然,我仍然在自己的空閒時間裏尋找這樣的解決方案。

回答

9

更新,解決了評論

要繞過所有證書檢查,您可以設置agent達到無法驗證證書。

$agent->ssl_opts(verify_hostname => 0); 

代理還將設置傳遞給正在使用的SSL套接字實現。例如,使用IO::Socket::SSL,您可以將SSL_verify_mode設置爲0x00

$agent->ssl_opts(SSL_verify_mode => 0x00); 
+1

這有時被引用爲解決方案,但它似乎並不適用於我的情況;儘管如此,我沒有時間對它進行廣泛的測試,而且我可能會犯錯誤。 我打算在測試環境中驗證它是否適用於我。 – 2008-12-09 08:28:22

9

嘗試重寫SSL證書驗證與

$agent->ssl_opts(verify_hostname => 0, 
       SSL_verify_mode => 0x00); 

你做的HTTPS請求之前。