2013-03-20 1 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:

I введите pa ssword, и он аутентифицируется правильно.

Итак, как я могу получить пароль для IO :: Socket :: SSL?

+0

Вам действительно нужно, что пароль? Как насчет его удаления? – cstamas

+0

К сожалению, да, я подключаюсь к удаленной системе, и они распространяют свои сертификаты таким образом. – dbyoung

ответ

3

Я нашел решение (и сообщил о проблеме), поэтому теперь вы можете решить эту проблему следующим образом.

В Mojo :: 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