昨日、Perl で作成した GCM メッセージ送信サーバの話。
どうも、昨日、CPAN で WWW::Google::Cloud::Messaging をインストールしてからだと思うのだが(結局、この Perl モジュールは使ってないけど(^^;)、LWP モジュールを呼ぶと、
# ./gcm_message_send.pl*******************************************************************Using the default of SSL_verify_mode of SSL_VERIFY_NONE for clientis depreciated! Please set SSL_verify_mode to SSL_VERIFY_PEERtogether with SSL_ca_file|SSL_ca_path for verification.If you really don't want to verify the certificate and keep theconnection open to Man-In-The-Middle attacks please setSSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.*******************************************************************at /usr/lib/perl5/site_perl/5.8.8/LWP/Protocol/http.pm line 31id=0:13685930XXXXXXXX%XXXX249ace0038c9
という感じで、エラーが出るようになった。
一応、メッセージ自体は送られているからエラーじゃないな。ワーニングだな。
どうも、WWW::Google::Cloud::Messaging のインストール時に、関連モジュールとして IO::Socket::SSL 関係もバージョンアップされちゃった臭いな(^^;
IO::Socket::SSL のバージョンが上がってセキュリティ関係に厳しくなって、「Man-In-The-Middle アタック の可能性があるので、サーバーとクライアントの間でホスト同士の証明書を交換するか、情報漏洩の可能性を承知で使うために、SSL_VERIFY_NONE を明示的に設定しましょう」ということのようであります。
取り敢えず、証明書交換はせず、SSL_VERIFY_NONE の設定で行きたいので、LWP::UserAgent のコンストラクタで、
my $ua = LWP::UserAgent->new(ssl_opts => {verify_hostname => 0,SSL_verify_mode => SSL_VERIFY_NONE,});
という具合に SSL_verify_mode オプションに定数 SSL_VERIFY_NONE をセットしてみたり、直接 0 をセットしてみたりしても状況変わらず。
む~ん(^^;
結局、LWP::UserAgent は SSL 接続のバックエンドとして Net::SSL も使えるってことだったので、環境変数 'PERL_NET_HTTPS_SSL_SOCKET_CLASS' に Net::SSL を指定し、IO::Socket::SSL を使わないようにしたらワーニングは出なくなった。
こんな感じ。
#!/usr/bin/perl## gcm_message_send.pl#use LWP;$ENV{'PERL_NET_HTTPS_SSL_SOCKET_CLASS'} = "Net::SSL";$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;my $ua = LWP::UserAgent->new;my $res = $ua->post("https://android.googleapis.com/gcm/send",{'registration_id' => "APA91bHi1fbAcCk1qwCMu6jO4IlJuAtXXXXXXXX_hhyK7atS6i6G_GuhtprPGroMnZkNQvKTWuAPxXXXXXXXXTLv-mKpIi_Ek9CpDPWvJQ79IZjmyXXXXXXXXttIgKOcf-GTcHRC8VmND3UpXXXXXXXXvfC4bw5hJw",'collapse_key' => 'update','data.message' => "これはテストメッセージです",},"User-Agent" => "NAF Perl Program/0.1","Authorization" => "key=AIzaSyDsXXXXXXXX9Lyazw0NYRVrXXXXXXXXHk","Content-Type" => "application/x-www-form-urlencoded;charset=UTF-8");print $res->content . "\n";
ま、これでいいか。(結局、環境変数のセット処理を 2行追加しただけだし(笑))
それに、現実的に、中間者攻撃で我が社の GCM メッセージが改ざんされる可能性は果てしなくゼロに近いからな(笑)
コメントする