0

我有一个私有证书,用于向外部网络服务器进行身份验证。我想自动下载网页,但每当它发出请求时,它都需要我的私钥密码。有没有办法通过脚本以某种方式提供这个密钥(在环境变量中或以其他方式)?一个小警告:这需要在 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;

到目前为止,它工作正常。它会拉下我在第二个参数中提供的网页,但是对于每个页面,我都必须输入我的 PEM 密码。感谢您的任何建议!

4

3 回答 3

2

从密钥中删除密码。

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

I am afraid you cannot supply passphrase for LWP::UserAgent, just remove it from certificate key.

You may try the following:

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

Optionally you may consider to use:

# 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 回答