新しい 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 処理が内部でどのように変更されたかという点で、より基本的なものです。