UserAgent 使った SSL 通信でハマってしまった[Perl]
(2015-05-15 14:03:01) by shinoda


サーバ移行案件で、ある Perl プログラムを新サーバに移行した。

そのプログラムは、LWP::UserAgent モジュールを使って、外部の HTTPS サーバと通信をしている。
まあ、写真のデータを取ってくるだけなんですけど。

ところが、新しいサーバで HTTPS 接続しても空のデータしか取れない。

Crypt::SSLeay
IO::Socket::SSL

や、ついでに

Net::SSLeay

とかとか。SSL 通信を行なうためのモジュールは入っているのに・・・である。

試しに、

#!/usr/bin/perl
use 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/plain
Content-Length:
Last-Modified:
Expires:
Server:

という寂しい結果が返ってくるだけ。

なんじゃ?と思ったのだが、そう言えば IO::Socket::SSL モジュールのバージョンが上がって、「ホスト同士で証明書交換せえよ。それが出来んのだったら『セキュリティ的には緩くなっちゃうのがわかってて、あえて証明書は用意してないんですよ』という意思表明のために、verify_hostname オプションを明示的に書けよ」ということになったのを思い出した。以前、このブログにも書いたことあるけどな。

というわけで、スクリプトに、

#!/usr/bin/perl
use 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/html
Content-Length: 18469
Last-Modified:  Sun, 01 Mar 2015 00:04:16 GMT
Expires:
Server:         Apache

このように通信可能となる。

そう言えば、この当該プログラムを書いたの、6年も前だ(^^;

長く動いているプログラムは、移行の時に色々ある(^^;

コメント投稿
次の記事へ >
< 前の記事へ
TOPへ戻る

Powered by
MT4i 3.0.8