2012-09-27 38 views
3

我很難獲得使用新LWP(6.x)的PKCS12證書。基本上,此代碼下perl5.8.8老Crypt::SSLeay(版本0.57)和LWP(版本5.826):如何將PKCS12 SSL證書與更新的LWP一起使用?

local $ENV{HTTPS_PKCS12_PASSWORD} = $sslPassword; 
local $ENV{HTTPS_PKCS12_FILE} = $pkcs12_cert; 
my $response = LWP::UserAgent->new->request(POST($url, Content => $content)); 

...但在perl5.14.2不和地穴的最新版本:: SSLeay的0.64)和LWP(6.03)。

通過不工作,我的意思是,我得到一個HTTP :: Response對象回來就好:

bless({ 
    '_content' => 'Can\'t connect to host:port 
', 
    '_rc' => 500, 
    '_headers' => bless({ 
          'client-warning' => 'Internal response', 
          'client-date' => 'Thu, 27 Sep 2012 18:28:34 GMT', 
          'content-type' => 'text/plain' 
          }, 'HTTP::Headers'), 
    '_msg' => 'Can\'t connect to host:port', 
    '_request' => ... 
) 

據我所知,很多SSL相關的代碼已經在最近LWP改變;已知PKCS12支持仍然有效?我應該設置不同的變量/選項以獲取證書和密碼嗎?

我也試過這個傳遞給LWP :: UserAgent->新的,沒有運氣:

ssl_opts => { 
    SSL_use_cert => 1, 
    SSL_cert_file => $pkcs12_cert, 
    SSL_passwd_cb => sub { $sslPassword }, 
} 

後續:我轉換PKCS12證書的PEM:

openssl pkcs12 -in my_pkcs12.p12 -out mycert.pem -clcerts -nokeys 
openssl pkcs12 -in my_pkcs.p12 -out mykey.pem -nocerts 
<passphrase entered> 

,並可以通過使用新的文件:

curl -k --cert mycert.pem --key mykey.pem --pass passphrase --cert-type PEM https://url 

...並設置在測試腳本這些環境變量:

$ENV{HTTPS_CERT_FILE} = 'mycert.pem'; 
$ENV{HTTPS_KEY_FILE} = 'mykey.pem'; 

...和作品以及下舊的LWP,並重新在新的LWP不工作..所以至少它是不一些特定於PKCS12證書的問題,但更重要的是SSL處理在內部發生了變化。

回答

2

對於PEM文件,至少,這一點也適用新的LWP(它似乎是環境變量不再承認? - 也許不再被默認使用的地穴:: SSLeay的)

my $ua = LWP::UserAgent->new(
    ssl_opts => { 
     SSL_use_cert => 1, 
     verify_hostname => 0, 
     SSL_cert_file => 'mycert.pem', 
     SSL_key_file => 'mypass.pem', 
     SSL_passwd_cb => sub { $passphrase }, 
    }, 
); 

這些選項記錄在IO::Socket::SSL;沒有提到如何在這裏使用PKCS12證書,所以至少對於那部分問題,我仍在尋找。

+0

後續跟進,一年後...我將PKCS12證書轉換成不同的格式,並用它來代替 - 並且挑剔我的供應商合作伙伴選擇該格式。 – Ether

1

我一直在草莓perl 5.14.2與WWW :: Mechanize 1.72使用PKCS12證書。

use Net::SSL(); 
use WWW::Mechanize; 
BEGIN { 
    $ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = "Net::SSL"; 
    $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; 
} 
$ENV{HTTPS_PKCS12_FILE} = $pfxfile; 
$ENV{HTTPS_PKCS12_PASSWORD} = $pfxpass; 
$ua = WWW::Mechanize->new(); 
$ua->cookie_jar({}); 
$ua->get($url); 

真正的痛苦是讓它與代理一起工作。

0

截至LWP 6.02,HTTPS的LWP的處理是分拆到LWP::Protocol::https取決於使用IO::Socket::SSL除非默認爲explicitly overridden

假設您沒有加載LWP::UserAgent前添加use Net::SSL或覆蓋$Net::HTTPS::SSL_SOCKET_CLASS,它會自動挑選IO::Socket::SSL不看環境變量:

local $ENV{HTTPS_PKCS12_PASSWORD} = $sslPassword; 
local $ENV{HTTPS_PKCS12_FILE} = $pkcs12_cert; 

如果明確或者通過環境或在你重寫$Net::HTTPS::SSL_SOCKET_CLASS腳本,您還需要通過以下環境再次禁用主機驗證:

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; 

或via

my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 }); 
0

的(剛剛發佈)1.988 IO的版本::插座:: SSL添加DER和透明支持PKCS#12格式,所以它應該是能夠給予PKCS#12文件只需在SSL_cert_file現在。