web-dev-qa-db-ja.com

LWPのアップグレード後にスクリプトが壊れた「証明書の検証に失敗しました」

私にはたくさんのスクリプトがありますが、そのほとんどはWWW::Mechanizeに基づいており、HTTP経由でアクセスできるその他のハードウェアからデータを取得します。ほとんどのPerlインストールとそのモジュールをアップグレードした後、HTTPS://を使用するすべてのスクリプトが"certificate verify failed"のために壊れました。

これは、新しいバージョンのLWPが証明書を適切にチェックし、何かが一致しない場合はdiesを実行するという事実の結果です。

私の場合、状況により証明書認証に失敗することが予想されるため、このチェックを完全に回避する方法を見つける必要がありました。

18
Jarmund

コードの前に次のものを追加しました:

$ENV{'Perl_LWP_SSL_VERIFY_HOSTNAME'} = 0;

これにより、スクリプトはクリーンでシンプルな方法でチェックを回避しました。

5
Jarmund

私はあなたに何かを伝えたい、そして私は他の誰にもそれを知られたくないと言います。パスワードを設定し、それを使用してメッセージを暗号化してから、メッセージを送信します。

パスワードと暗号化されたメッセージを渡した相手があなたであるかどうかを確認できなかった場合はどうなりますか?そうすれば、何人でもあなたになりすますことができ、暗号化は無駄になります。それが最近までのLWPのHTTPSサポートの状態でした。

これで、LWPに以前のように動作するように要求しない限り、LWPは実際に誰と話しているのかを確認します。あなたはそれを使用してそれを行うことができます:

my $ua = LWP::UserAgent->new(
   ssl_opts => { verify_hostname => 0 },
);

あらゆる場所でオプションを指定せずに、スクリプト内のすべてのLWP :: UserAgentインスタンスに影響を与えたい場合は、スクリプトに以下を追加できます。

$ENV{Perl_LWP_SSL_VERIFY_HOSTNAME} = 0;

または、次のようにスクリプトを起動できます。

Perl_LWP_SSL_VERIFY_HOSTNAME=0 script.pl

最後に、LWPを常に安全でないものにしたい場合は、ログインスクリプトに次を追加できます。

export Perl_LWP_SSL_VERIFY_HOSTNAME=0

ただし、上記のいずれもお勧めしません。はるかに優れたオプションは、通信しているホストの証明書を提供することです。 (これは、私が何を意味するかを知っている場合、Firefoxで例外を追加することと同じです。)$ua->ssl_optsについては ドキュメント を参照してください。

21
ikegami

私にとっては、以下を使用します。

my $ua = LWP::UserAgent->new(
  ssl_opts => { verify_hostname => 0 },
);

降伏

クライアントにSSL_VERIFY_NONEのデフォルトのSSL_verify_modeを使用することは非推奨です!確認のために、SSL_verify_modeをSSL_CA_file | SSL_ca_pathとともにSSL_VERIFY_PEERに設定してください。本当に証明書を検証せず、中間者攻撃に対して接続を開いたままにしておきたくない場合は、アプリケーションでSSL_verify_modeをSSL_VERIFY_NONEに明示的に設定してください。

これを使用しても警告は表示されませんでした。

my $ua = LWP::UserAgent->new(
  ssl_opts => { SSL_verify_mode => 'SSL_VERIFY_NONE'},
);
12
user2597132

@ikegamiは、SSLホスト名検証を無効にしたくない理由については良い議論をしますが、それを回避する方法については直接言及していません。

CA署名付き証明書を使用してパブリックシステムと通信している場合は、LWPがディストリビューションのルート証明書コレクションを指すようにする必要があります。 Debianベースのシステム(Ubuntuなど)では、これは/etc/ssl/certs/の下に保持されます。

BEGIN {
    $ENV{HTTPS_CA_DIR} = '/etc/ssl/certs'
}

自己署名証明書を使用して独自のサーバーと通信している場合は、その証明書のコピーをクライアントに保存し、スクリプトでその特定のファイルを指定できます。

BEGIN {
    $ENV{HTTPS_CA_FILE} = '/path/to/my/server-certificate.crt'
}

代わりに、スクリプトを実行する前にこれらを環境に設定するか(たとえば、シェルからエクスポートする)、設定をUserAgentオブジェクトに直接適用することができます。詳細については、 LWP :: UserAgentのドキュメント を参照してください。 ssl_optsを検索します(ページのほぼ半分)。

4
Jander