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

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

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

diesこれは、LWP の新しいバージョンが証明書を適切にチェックし、一致しないものがあるかどうかをチェックするようになった結果です。

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

ベストアンサー1

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

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

現在、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

おすすめ記事