0

外部 Web サーバーでの認証に使用するプライベート証明書があります。ウェブページのダウンロードを自動化したいのですが、リクエストを行うたびに秘密鍵のパスフレーズが必要です。何らかの方法でスクリプトを介してこのキーを提供する方法はありますか (環境変数またはその他の方法で)。1 つ注意点があります。これは Windows マシンで実行する必要があるため、Expect モジュールは使用できません。

これが私がこれまでに持っているコードです:

use strict;
use warnings;
use LWP::UserAgent;

my $output_doc = $ARGV[0];
my $url = $ARGV[1];
$ENV{HTTPS_PROXY} = 'http://1.2.3.4:3128';
$ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = "Net::SSL";
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; 
$ENV{HTTPS_DEBUG} = 1;
$ENV{HTTPS_CERT_FILE} = 'test_cert/cert.pem';
$ENV{HTTPS_KEY_FILE} = 'test_cert/private.key';

my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => "$url");
my $response = $ua->request($req);

open OUT, ">$output_doc";
print OUT $response->as_string;
close OUT;

これまでのところ、正常に動作しています。2 番目の引数で指定した Web ページをプルダウンしますが、ページごとに PEM パスフレーズを入力する必要があります。ご提案ありがとうございます。

4

3 に答える 3

2

キーからパスフレーズを削除します。

openssl rsa -in private.key -out private-nopass.key
于 2012-04-18T16:12:35.363 に答える
1

LWP::UserAgentにパスフレーズを指定することはできません。証明書キーからパスフレーズを削除するだけです。

次のことを試すことができます。

...
my $ua = LWP::UserAgent->new; 
my $req = HTTP::Request->new(GET => "$url"); 

$IO::Socket::SSL::GLOBAL_CONTEXT_ARGS->{SSL_passwd_cb} = sub { 
  # get passphrase
  return $passphrase 
};

my $response = $ua->request($req);
...

オプションで、以下の使用を検討できます。

# Client PKCS12 cert support 
$ENV{HTTPS_PKCS12_FILE}     = 'certs/pkcs12.pkcs12'; 
$ENV{HTTPS_PKCS12_PASSWORD} = 'PKCS12_PASSWORD';
于 2012-04-18T16:44:00.073 に答える
-1

最終的に PKCS12 形式でキーを作成しました。

# Client PKCS12 cert support
$ENV{HTTPS_PKCS12_FILE}     = 'certs/pkcs12.pkcs12';
$ENV{HTTPS_PKCS12_PASSWORD} = 'PKCS12_PASSWORD';

これは問題なく動作しました。

于 2012-04-18T19:29:53.943 に答える