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

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和最新版本的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>


并可以通过以下方式使用新文件:

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下也不会再工作。

最佳答案

至少对于PEM文件,这适用于新的LWP(似乎不再识别环境变量-也许默认不再使用Crypt :: 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证书,因此至少对于问题的那一部分,我仍在搜索。

关于perl - 如何在更新的LWP中使用PKCS12 ssl证书?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12627577/

10-09 16:08