2

私はMojoliciousを初めて使用し、Mojo :: UserAgentスクリプトを取得してTLS認証局とTLS証明書ファイルの両方を使用しようとしていますが、証明書ファイルはパスワードで保護されています。クライアント証明書を開くことができるようにパスワードを渡す際に問題が発生しました。

私は次のコードを持っています:


#!/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:

パスワードを入力すると、正しく認証されます。

では、IO :: Socket :: SSLのパスワードを取得するにはどうすればよいですか?

4

1 に答える 1

3

私は解決策を見つけました(そして問題を報告しました)ので、今のところあなたはこれを以下で解決することができます。

Mojo :: IOLoop :: Clientで、次のように変更されました。

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";
}
于 2013-03-21T15:55:34.420 に答える