2013-03-20 108 views
2

我是Mojolicious的新手,我試圖讓Mojo :: UserAgent腳本同時使用TLS證書頒發機構和TLS證書文件,但證書文件受密碼保護。我有問題傳遞密碼,因此客戶端證書可以打開。Mojo :: UserAgent TLS/SSL證書認證

我有以下代碼:


#!/usr/bin/env perl 

use Modern::Perl; 
use Mojo::UserAgent; 

IO::Socket::SSL::set_defaults(SSL_passwd_cb => sub {return "password";}); 
my $ua = Mojo::UserAgent->new; 
my $base_dir = '/path/to/certs/'; 
$ua->ca($base_dir . 'ca-cert.crt'); 
$ua->cert($base_dir . 'clientcert.crt'); 
my $tx = $ua->build_tx(POST => '/POST HTTP/1.1'); 
$tx->req->url->parse('https://example.com:12345'); 
$ua->start($tx); 

if(my $res = $tx->success) { 
    say $res->body; 
    print Dumper($tx); 
} else { 
    my ($err, $code) = $tx->error; 
    say $code ? "$code response: $err" : "Connection error: $err"; 
} 

我與驗證證書的以下內容:

openssl s_client -connect host:port -CApath /path/to/cert - CAfile ca-cert.crt -cert clientcert.crt

我得到提示:

Enter pass phrase for clientcert.crt:

我進入pa ssword和它正確的身份驗證。

那麼,我如何獲得IO :: Socket :: SSL的密碼?

+0

你真的需要密碼?去除它呢? – cstamas 2013-03-20 22:25:30

+0

不幸的是,我正在連接到遠程系統,他們以這種方式分發他們的證書。 – dbyoung 2013-03-21 01:21:35

回答

3

我找到了一個解決方案(並報告了問題),所以現在你可以用下面的方法解決這個問題。

在魔:: IOLoop ::客戶端更改了以下內容:

SSL_key  => $args->{tls_key}, 
#SSL_key_file  => $args->{tls_key}, 

然後,您可以用下面的代碼進行驗證:

#!/usr/bin/env perl 

use Modern::Perl; 
use Mojo::UserAgent; 

my $ua = Mojo::UserAgent->new; 
my $base_dir = '/path/to/certs/'; 
$ua->ca($base_dir . 'ca-cert.crt'); 
$ua->cert($base_dir . 'clientcert.crt'); 

my $bio = Net::SSLeay::BIO_new_file($base_dir . 'clientcert.crt', 'r'); 
my $privkey = Net::SSLeay::PEM_read_bio_PrivateKey($bio, undef, 'password'); 
$ua->key($privkey); 

my $tx = $ua->post('https://example.com:12345'); 

if(my $res = $tx->success) { 
    say $res->body; 
    print Dumper($tx); 
} else { 
    my ($err, $code) = $tx->error; 
    say $code ? "$code response: $err" : "Connection error: $err"; 
} 
+0

謝謝@Joel Berger,看起來好多了。 – dbyoung 2013-03-27 02:46:42