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