21

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

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

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

4

4 に答える 4

24

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

パスワードと暗号化されたメッセージを渡した相手があなたであるかどうかを確認しなかった場合はどうなりますか?そうすれば、何人でもあなたになりすますことができ、暗号化は無駄になります。それが最近までの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

于 2012-11-14T19:33:56.430 に答える
15

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

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'},
);
于 2013-07-18T20:20:40.327 に答える
7

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

$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;

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

于 2012-11-14T19:24:29.030 に答える
5

@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(ページのほぼ半分)を検索します。

于 2015-01-09T20:48:24.060 に答える