[Perl] LWP::UserAgent で SSL 証明書のエラーへの対応

Posted by
ぴろり
Posted at
2011/11/21 21:31
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
開発メモ カテゴリ
カバーイメージ

 LWP::UserAgent モジュールを使って、Facebook の API を叩いている時に出くわした現象の対応メモ。Facebook では API のリクエストを HTTPS で行うのですが、この時、クライアントにインストールされている SSL 証明書と、Facebook で使用している証明書の不整合か何かでエラーになってしまうというものです。

このエントリーをはてなブックマークに追加  

背景

 例えば、次のような Perl スクリプトを書いて HTTPS で公開されている URL にアクセスしようとします。

use LWP::UserAgent;
my $ua = LWP::UserAgent->new or die;
my $res = $ua->get( 'https://www.example.com/hoge.txt' ) or die;

 この時、インストールされている Crypt::SSLeay の持っている認証局の一覧に、www.example.com の SSL 証明書が掲載されていなかったりして、ルート証明書まで辿り着けなかったりすると、次のようなエラーが生成されます。

500 Can't verify SSL peers without knowning which Certificate Authorities to trust

対応方法 1. ホスト名の検証をしない

 環境変数 PERL_LWP_SSL_VERIFY_HOSTNAME を 0 に設定するか、LWP::UserAgent の通信オプションを設定することで、証明書のホスト名による検証を抑制します。ただ、この方法だと SSL 通信をしている意味が半分なくなってしまうので、実験目的などに限って使うくらいで。

$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
# または
$ua->ssl_opts( verify_hostname => 0 );

対応方法 2. CA を明示する

 LWP::UserAgent の通信オプションで、認証に用いる CA 証明書を明示する方法です。多分、こっちのが安全。Mozilla::CA モジュールは、CPAN を使ってサクサクッとインストールできます。

use LWP::UserAgent;
use Mozilla::CA;
my $ua = LWP::UserAgent->new or die;
$ua->ssl_opts( SSL_ca_file => Mozilla::CA::SSL_ca_file());
my $res = $ua->get( 'https://www.example.com/hoge.txt' ) or die;
このエントリーをはてなブックマークに追加  


この記事を読んだ人はこんな記事も読んでいます記事リコメンデーションについて

カバー画像:Perl と生ソケットで書く最も無骨なプロキシサーバ

関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。