LWP::UserAgentでHTTPS接続できない問題を解決
PerlのLWP::UserAgentでホームページにアクセスしてHTMLを取得するというプログラムを書いていたのですが、HTTPS(SSL)のページにアクセスしようとすると、エラーが出てうまくいかないという問題に直面してしまいました。
その時に書いていたプログラムがこんな感じです。
my $url = "https://xxx.yyy.jp";
my $request = HTTP::Request->new(GET => $url);
my $ua = LWP::UserAgent->new;
my $res = $ua->request($request);
my $result = $res->content;
my $request = HTTP::Request->new(GET => $url);
my $ua = LWP::UserAgent->new;
my $res = $ua->request($request);
my $result = $res->content;
ごく普通に、URLを指定して、LWP::UserAgentでアクセスするというものです。
HTTPのページは問題ないのですが、HTTPSだと失敗するんですね。
これを実行しようとしたら、Crypt::SSLeayもしくはIO::Socket::SSLがないとアクセスできないと怒られてしまいました。
仕方がないので、cpanからインストールしようと思って、以下のコマンドを入力します。
cpan install Crypt::SSLeay
やってみたところダメだと怒られました。もう一つの方も試してみます。
cpan install IO::Socket::SSL
これもダメだと怒られました。
何が悪いのかよく分からず、調べていたらどうやらOpen SSLが関係しているかもしれないという記事を読んだので、試しにopenssl-develをyumで入れてみました。
yum install openssl-devel
これはすんなり入ってくれました。
で、プログラムを実行すると、今度はエラーメッセージが変わり、Net::SSLeayが必要だ、と表示されたので、次のようにNet::SSLeayをインストールしました。
cpan install Net::SSLeay
そして、これでうまくいくかと思ってプログラムを実行してみたのですが、今度はLWP::Protocol::httpsが必要だと怒られました。トラブルは続きます。
同じようにcpanからインストールしようと
cpan install LWP::Protocol::https
とやってみますが、これもまたインストールに失敗します。メッセージを読んでみると以下のような箇所があり、どうやらSSLでの接続(www.apache.org:443)に
失敗しているようです。wgetでアクセスしてみてもうまく接続できません。
# Failed test at t/apache.t line 15.
# Failed test at t/apache.t line 16.
# 'Can't connect to www.apache.org:443 (certificate
+verify failed)
#
# LWP::Protocol::https::Socket: SSL connect attempt failed with unknow
+n error error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certi
+ficate verify failed at /usr/local/Perl-5.14/lib/perl5/site_perl/5.14
+.2/LWP/Protocol/http.pm line 51.
# '
# Failed test at t/apache.t line 16.
# 'Can't connect to www.apache.org:443 (certificate
+verify failed)
#
# LWP::Protocol::https::Socket: SSL connect attempt failed with unknow
+n error error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certi
+ficate verify failed at /usr/local/Perl-5.14/lib/perl5/site_perl/5.14
+.2/LWP/Protocol/http.pm line 51.
# '
あれこれ試してみてうまくいかず、あきらめかけていた時にふと思いついたのが、ソースからインストールしようということ。
LWP::Protocol::httpsのソースをダウンロードしてきて、マニュアルでインストールしてみました。
wget http://search.cpan.org/CPAN/authors/id/M/MS/MSCHILLI/LWP-Protocol-https-6.06.tar.gz
tar xvfz LWP-Protocol-https-6.06.tar.gz
cd LWP-Protocol-https-6.06
perl Makefile.PL
make
make install
tar xvfz LWP-Protocol-https-6.06.tar.gz
cd LWP-Protocol-https-6.06
perl Makefile.PL
make
make install
はい、すんなりインストール完了。cpanで出ていたややこしいエラーメッセージは全くでなくなりました。
そして、プログラム実行です。つながるかな?と思ってリターンキーを押すと・・
やった!つながった!無事にHTMLを取得することができました。
こんな感じで解決できると思います。はまっている方が結構いらっしゃるようでしたので、ご参考になりましたら幸いです。