在HTTP请求中使用证书时如何提供私有密码?

时间:2012-04-18 15:28:43

标签: perl

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

3 个答案:

答案 0 :(得分:2)

Remove the passphrase from the key.

openssl rsa -in private.key -out private-nopass.key

答案 1 :(得分: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';

答案 2 :(得分:-1)

我最终创建了PKCS12格式的密钥。

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

这没有问题。