これがHTTPSリクエストを実行するプログラムで、最初にいくつかのコードがあり、以下で説明します。
use 5.012;
use LWP::UserAgent;
use HTTP::Request::Common;
use Net::SSLeay;
BEGIN {
return unless $^O eq 'MSWin32'; # only needed on Windows
print STDERR "attempting to set HTTPS_CA_FILE to PEM file path\n";
require Mozilla::CA; # load module to determine PEM file path
my $pemfile = do {
my $path = $INC{ 'Mozilla/CA.pm' };
$path =~ s#\.pm$#/cacert.pem#;
$path;
};
if ( -f $pemfile ) {
$ENV{HTTPS_CA_FILE} = $pemfile;
print STDERR "HTTPS_CA_FILE set to $pemfile\n";
}
else {
warn "PEM file $pemfile missing";
}
} # ==========================================================================
$Net::SSLeay::trace = 2;
my $ua = LWP::UserAgent->new;
my $req = GET 'https://client.billsafe.de/';
my $rsp = $ua->request( $req );
say $rsp->is_success ? 'success' : 'failure';
say $rsp->status_line;
say '=================';
say substr $rsp->decoded_content, 0, 200;
say '=================';
# possibly relevant module versions
for ( qw/Net::SSLeay Crypt::SSLeay LWP::Protocol::https Mozilla::CA/ ) {
no strict 'refs';
say $_, "\t", ${"${_}::VERSION"}
}
最初のコードは、環境変数HTTPS_CA_FILE
を、デフォルトでロードされるPEMファイルの値にcacert.pem
設定Mozilla::CA
します(を使用してチェックしprocmon.exe
ました。ファイルはデフォルトで完全に読み取られます)。
この明らかに無意味な設定を行う理由は、環境変数が設定されていない場合に証明書の検証に失敗してSSLセットアップが失敗するWindowsマシン(Windows Server 2008)があるためです。なぜそうなのかは私たちには謎です。Net::SSLeay
また、、、LWP::Protocol::https
およびのバージョンが同じである他のWindowsマシンでも正常に動作しますMozilla::CA
。
モジュールのバージョンは次のとおりです。
- Net :: SSLeay 1.36
- Crypt ::SSLeay-/-
- LWP :: Protocol :: https 6.02
- Mozilla :: CA 20110409
ここで質問:cacert.pem
ルート証明書がこのコンステレーション(Windows、Perl、Net :: SSLeay)からロードされる場所以外に、他の場所はありますか?もしそうなら、彼らは何ですか?どこで読むことができますか?
アップデート
OpenSSLのドキュメントでは、プレーンファイルとプレーンディレクトリ以外の証明書ストアについては言及されていません。
システム証明書ストアを開くために使用されるWindowsCAPI関数は次のとおりです。
CVSからOpenSSLHEADをチェックアウトしました。このCertOpenStore
関数は実際にで使用されていengines/e_capi.c
ます。問題のサーバー上のOpenSSLバージョンのストアにアクセスするために何が使用されているかを調べるためにこれ以上調査していません。
Web検索を行うと、OpenSSLがWindows証明書ストアに直接アクセスできるかどうか疑問に思っている人や、それに応じてOpenSSLにパッチを適用することを提案している人がいます。TortoiseSVNリスト(Windows証明書ストア/ OpenSSL CAPI)にもこの最近の問題があります。ここで何が問題なのかを見つけるために、さらにいくつかの調査が必要でした。