サーバ移行案件で、ある Perl プログラムを新サーバに移行した。
そのプログラムは、LWP::UserAgent モジュールを使って、外部の HTTPS サーバと通信をしている。
まあ、写真のデータを取ってくるだけなんですけど。
ところが、新しいサーバで HTTPS 接続しても空のデータしか取れない。
Crypt::SSLeayIO::Socket::SSL
や、ついでに
Net::SSLeay
とかとか。SSL 通信を行なうためのモジュールは入っているのに・・・である。
試しに、
#!/usr/bin/perluse HTTP::Status;use LWP::UserAgent;$ua = new LWP::UserAgent;$ua->agent("LWP::GETHEAD");$url = $ARGV[0];$request = new HTTP::Request HEAD => $url;$response = $ua->request($request);print "Content-Type:\t", $response->header("Content-Type"),"\n";print "Content-Length:\t", $response->header("Content-Length"),"\n";print "Last-Modified:\t", $response->header("Last-Modified"),"\n";print "Expires:\t", $response->header("Expires"),"\n";print "Server: \t", $response->header("Server"),"\n";
こういうスクリプトを作って走らせてみても、
# perl test.pl https://www.exsample.jp/Content-Type: text/plainContent-Length:Last-Modified:Expires:Server:
という寂しい結果が返ってくるだけ。
なんじゃ?と思ったのだが、そう言えば IO::Socket::SSL モジュールのバージョンが上がって、「ホスト同士で証明書交換せえよ。それが出来んのだったら『セキュリティ的には緩くなっちゃうのがわかってて、あえて証明書は用意してないんですよ』という意思表明のために、verify_hostname オプションを明示的に書けよ」ということになったのを思い出した。以前、このブログにも書いたことあるけどな。
というわけで、スクリプトに、
#!/usr/bin/perluse HTTP::Status;use LWP::UserAgent;$ua = new LWP::UserAgent;$ua->agent("LWP::GETHEAD");$ua->ssl_opts( verify_hostname => 0 );$url = $ARGV[0];$request = new HTTP::Request HEAD => $url;$response = $ua->request($request);print "Content-Type:\t", $response->header("Content-Type"),"\n";print "Content-Length:\t", $response->header("Content-Length"),"\n";print "Last-Modified:\t", $response->header("Last-Modified"),"\n";print "Expires:\t", $response->header("Expires"),"\n";print "Server: \t", $response->header("Server"),"\n";
という具合に一文入れてやるだけで、
# perl test.pl https://www.exsample.jp/Content-Type: text/htmlContent-Length: 18469Last-Modified: Sun, 01 Mar 2015 00:04:16 GMTExpires:Server: Apache
このように通信可能となる。
そう言えば、この当該プログラムを書いたの、6年も前だ(^^;
長く動いているプログラムは、移行の時に色々ある(^^;