perl で AWS S3 へアクセスするときに Net::Amazon::S3 というモジュールを使いました。
インターフェースもわかりやすいです。
my $s3 = Net::Amazon::S3->new(...);
する際に secure => 1 という SSL 通信を使うためのオプションをセットすると通信時にエラーが起きてしまい悩んでいたのですが、解決したのでそのメモです。
エラーと原因
Net::Amazon::S3 が内部で使っている LWP::UserAgent モジュール。
これが SSL 通信するときにデフォルトで使っている CA ファイルは Mozilla::CA::SSL_ca_file() というものらしいのですが、Mozilla::CA モジュールが新しすぎると
SSL3_GET_SERVER_CERTIFICATE:certificate verify failed LWP/Protocol/http.pm
のようなエラーになります。
解決方法
Mozilla::CA モジュールの'20141217'バージョン(現在の最新版)を使っていると上のようなエラーが起きるので、'20130114'バージョンまたはそれ以前のものを使うようにします。
2014年のバージョンからは 1024 bit な証明書ファイルがだいぶ削除されてしまったというのがことの原因のようです。
詳しくは参考サイトをどうぞ。
参考サイト
PerlMonks: SSL Certificate Verification problem, using LWP::UserAgent by ManyHats