9

LWP を使用して特定の https Web サイトに接続しようとすると、次のエラーが発生します。

LWP::Protocol::https::Socket: SSL connect attempt failed with unknown errorerror:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at /usr/local/share/perl/5.14.2/LWP/Protocol/http.pm line 51.

私はwgetで試してみました:

ERROR: cannot verify [domain]'s certificate, issued by `/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certificates.godaddy.com/repository/CN=Go Daddy Secure Certification Authority/serialNumber=********':
  Unable to locally verify the issuer's authority.

私はグーグルで検索し、おそらくgodaddyルートCA証明書をインストールする必要があることを発見しました. その方法を見つけました(証明書をダウンロードし、/usr/share/ca-certificates に入れ、update-ca-certificates を実行します)。また、プロセスで openssl s_client を使用する方法も学びました。

証明書がインストールされたので、wget は機能しますが、LWP は引き続き同じエラーで失敗し、openssl s_client も失敗します。

# openssl s_client -connect [domain]:443
CONNECTED(00000003)
depth=0 O = [domain], OU = Domain Control Validated, CN = [domain]
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 O = [domain], OU = Domain Control Validated, CN = [domain]
verify error:num=27:certificate not trusted
verify return:1
depth=0 O = [domain], OU = Domain Control Validated, CN = [domain]
verify error:num=21:unable to verify the first certificate
verify return:1

これを機能させるために次にどこに行くべきかわかりません。助言がありますか?


編集:解決済み mikewの提案の後に何が機能したかを説明する簡単なスクリプトを次に示します。

#!/usr/bin/perl
use LWP::UserAgent;
$URL="[domain]";
my $ua = LWP::UserAgent->new(ssl_opts => { SSL_ca_path=>'/etc/ssl/certs'});
my $response = $ua->get($URL);
4

1 に答える 1

8

より具体的な回答を得るには、LWP オブジェクトをインスタンス化する方法を知る必要があります。

しかし、おそらく知っておく必要があるのは、LWP コンストラクターのSSL_ca_fileandSSL_ca_pathオプションです。ssl_optsこれらのいずれかが設定されていない場合、Mozilla_CA が Web サイトの検証に使用する CA であると見なされます。

LWP::Protocol::https およびLWP::UserAgentssl_optsコンストラクタ オプションを参照してください。

lwp-download などを使用していて、実際に LWP::UserAgent オブジェクトを自分でインスタンス化していない場合は、PERL_LWP_SSL_CA_FILE環境変数を認証局を指すように設定PERL_LWP_SSL_CA_PATHするか、CA パスを設定する必要があります。に渡す代わりに、これらを設定することもできssl_optsます。

このすべての検証を行うことに特に心配がなく、危険な生活をしたい場合は、環境変数を設定verify_hostname => 0するssl_optsか、0 に設定できます。PERL_LWP_VERIFY_HOSTNAME

また、ドキュメントに記載されているように、LWP 5.837 以前ではverify_hostnameデフォルトでオフになっていましたが、それ以降のバージョンではデフォルトでオンになっています。

于 2013-10-16T01:56:28.620 に答える