LWP::UserAgentでhttpsに接続できないのが解決してないから現時点までのメモ
一連の流れ
#!/usr/bin/perl use strict; use LWP::UserAgent; use Encode; my $ua = LWP::UserAgent->new(); $ua->agent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8'); $ua->default_headers->push_header('Accept-Language' => "ja-jp"); my $url = 'https://etsuran.mlit.go.jp/TAKKEN/kensetuKensaku.do'; print decode('Shift_JIS' , $ua->get($url)->content);
MacBook-Pro:Documents up2$perl get.pl
Can't connect to etsuran.mlit.go.jp:443 (LWP::Protocol::https::Socket: SSL connect attempt failed error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure)
LWP::Protocol::https::Socket: SSL connect attempt failed error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure at /Library/Perl/5.18/LWP/Protocol/http.pm line 50.
というようなエラーが発生してしまいます。検索すると、全く同じ問題についての日本語の記事が複数見つかるありがたい時代になったなと実感します。
- LWP::Protocol::https - Provide https support for LWP::UserAgent - metacpan.org
- LWP::UserAgentでHTTPS接続できない問題を解決
- LWP::UserAgentのHTTPS接続の不安定さを解消 - Qiita
- PerlでSSL(https)のサイトのコンテンツが取得できない - ノウハウブログ - カンタローCGI
- cpanでNet::SSLeay入れようとするとエラーになる - Qiita
- Homebrewとopensslのインストール - Qiita
- El Capitanでソースをコンパイルしたときにopensslのエラーが出た場合の対処方法 - Qiita
これらのサイトによると、Crypt::SSLeay、IO::Socket::SSL、Net:SSLなどのモジュールが必要なようです。そしてこれらのインストールには、homebrewによってOpenSSLを インストールする必要があるのだと。そしてそのOpenSSLを環境変数に追加してcpan install するとエラーが出ます。
Running make install
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ERROR: Can't create '/Library/Perl/5.18/darwin-thread-multi-2level/Crypt'
mkdir /Library/Perl/5.18/darwin-thread-multi-2level/Crypt: Permission denied at /System/Library/Perl/5.18/ExtUtils/Install.pm line 469.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
at -e line 1.
make: *** [pure_site_install] Error 13
NANIS/Crypt-SSLeay-0.72.tar.gz
/usr/bin/make install -- NOT OK
パーミッションが拒否されたのsudoしてみると、今度はまた別のエラーが出ます。
openssl-version.c:2:10: fatal error: 'openssl/opensslv.h' file not found
#include <openssl/opensslv.h>
^~~~~~~~~~~~~~~~~~~~
1 error generated.
Failed to build and link a simple executable using OpenSSL
No 'Makefile' created'YAML' not installed, will not store persistent state
NANIS/Crypt-SSLeay-0.72.tar.gz
/usr/bin/perl Makefile.PL -- NOT OK
sudoすると環境変数が変わるのかを確認したりcpan installする前にエラーがでたファイルのパーミッションを変えてみればいいのかもしれないのですが、ちょっと疲れたので今日はここまでにしておきます。あとLWP::Protocol::httpsはインストールできたのでとりあえず例にあった通りにスクリプトを書き換えて試してみましたがが、インストールする前と同じエラーが出ました。
my $ua = LWP::UserAgent->new( ssl_opts => { SSL_ca_path => '/etc/ssl/certs', verify_hostname => 1, } );
その場しのぎはできてる
URLをhttpsからhttpに変えても同じサイトにアクセス出来るので、そちらなら普通にGETが通ります。ですがSSLに接続できていないという問題は根本的に解決していないので、どうにかしたいなというところです。