2012-04-18 59 views
0

我有一個私人證書,我使用外部網絡服務器進行身份驗證。我想自動下載網頁,但是每當它發出請求時,它都需要我的私鑰密碼。有沒有辦法通過腳本以某種方式提供此密鑰(無論是在環境變量還是以其他方式)?一個小小的警告:這需要在Windows機器上運行,所以我不能使用Expect模塊。如何在HTTP請求中使用證書時提供私人密碼?

這裏是我到目前爲止的代碼:

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密碼。感謝您的任何建議!

回答

2

Remove the passphrase from the key.

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

感謝您的建議。儘管如此,我們仍想保留密碼。 – Magicked 2012-04-18 19:30:28

+0

如果密鑰的密碼是以明文形式存儲在腳本中的,那麼首先密碼並沒有真正的意義。 – josh3736 2012-04-18 19:32:41

1

恐怕你不能LWP ::用戶代理提供的密碼,剛剛從證書關鍵刪除

你可以嘗試以下方法:

... 
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'; 
-1

我結束了創建的PKCS12格式的密鑰。

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

這工作沒有問題。

+0

這正是我在原始答案中建議你的內容,以及你剛纔提到的內容。那麼,但這不是你發佈的問題的答案,對嗎? – 2012-04-18 20:32:01

+0

@stackoverflow:其實,[你似乎一直是誰複製他的答案到你的](http://stackoverflow.com/posts/10214022/revisions)。 OP在你編輯你的答案之前發佈了這個。他不可能從你那裏複製它,除非你知道我們沒有的東西。你願意詳細說明嗎? – BoltClock 2012-04-21 22:12:38

+0

@ BoltClock'saUnicorn - 不正確 - 作爲主持人,您應該看到我的另一個已刪除的答案,並查看該帖子的日期和時間。得到它了? – 2012-04-21 22:18:14

相關問題