我很难使用新的 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 下也不能正常工作。所以至少它不是特定于 PKCS12 证书的问题,而是在内部更改 SSL 处理方式方面更基本的东西。