Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何将PKCS12 ssl证书与较新的LWP一起使用?_Perl_Ssl_Pkcs#12 - Fatal编程技术网

Perl 如何将PKCS12 ssl证书与较新的LWP一起使用?

Perl 如何将PKCS12 ssl证书与较新的LWP一起使用?,perl,ssl,pkcs#12,Perl,Ssl,Pkcs#12,我很难使用新的LWP(6.x)获得PKCS12证书。基本上,此代码在perl5.8.8和旧版本(版本0.57)和(版本5.826)下工作: …但不在perl5.14.2和Crypt::SSLeay 0.64)和LWP(6.03)的最新版本下 我的意思是,我得到了一个HTTP::Response对象,如下所示: bless( { '_content' => 'Can\'t connect to host:port ', '_rc' => 500, '_he

我很难使用新的LWP(6.x)获得PKCS12证书。基本上,此代码在perl5.8.8和旧版本(版本0.57)和(版本5.826)下工作:

…但不在perl5.14.2和Crypt::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' => ...
)
我知道最近LWP中有很多与ssl相关的代码发生了变化;已知PKCS12支持仍然有效吗?我应该设置不同的变量/选项以获取证书和密码吗

我还尝试将其传递给LWP::UserAgent->new,但没有成功:

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>
…并在测试脚本中设置这些环境变量:

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

…这在旧LWP下同样有效,但在新LWP下同样无效。。因此,至少这不是PKCS12证书所特有的问题,而是SSL处理如何在内部进行更改的更基本的问题。

对于PEM文件,至少,这适用于新的LWP(环境变量似乎不再被识别-可能默认情况下不再使用Crypt::SSLeay?)


这些选项记录在;这里没有提到如何使用PKCS12证书,所以至少对于这部分问题,我还在搜索。

我一直在使用WWW::Mechanize 1.72的草莓perl 5.14.2中的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);
真正的痛苦是让它与代理一起工作。

截止到,LWP对HTTPS的处理是不绑定的,这取决于使用情况,除非是默认情况

假设在加载
LWP::UserAgent
之前没有添加
use Net::SSL
或覆盖
$Net::HTTPS::SSL_SOCKET\u类
,它会自动选择不查看环境变量的
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;
或通过

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

IO::Socket::SSL(刚刚发布)的1.988版增加了对DER和PKCS#12格式的透明支持,因此现在应该可以在SSL#证书#文件中提供PKCS#12文件。

一年后的后续行动。。。我将我的PKCS12证书转换成一种不同的格式,并使用了它——并责怪我的供应商合作伙伴选择了这种格式。
local $ENV{HTTPS_PKCS12_PASSWORD} = $sslPassword;
local $ENV{HTTPS_PKCS12_FILE} = $pkcs12_cert;
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });