2012-09-27 33 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现在。