3

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

4

4 に答える 4

3

少なくとも 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 証明書の使用方法については言及されていないため、少なくともその部分の問題については、まだ調査中です。

于 2012-09-27T19:00:20.973 に答える
1

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);

本当の苦労は、プロキシで動作させることでした。

于 2013-11-02T11:04:09.160 に答える
0

LWP 6.02の時点で、LWP の HTTPS の処理はLWP::Protocol::httpsに分離されました。LWP::Protocol::httpsは、デフォルトが明示的にオーバーライドされない限り、uses IO::Socket::SSLに依存します。

またはをロードする前にuse Net::SSLオーバーライドを追加しなかったと仮定すると、環境変数を参照しないものを自動的に選択します。$Net::HTTPS::SSL_SOCKET_CLASSLWP::UserAgentIO::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 });
于 2014-04-16T12:00:42.513 に答える