あなたの天然記念物
ホーム更新雑談Perl鉄ゲタランドナーコースガイド自転車Linuxリンク経歴連絡先

Perlでツイッター (2014.10.24)

ツイッターのSSLv3使用停止が影響

SSLの脆弱性でツイッターがSSLv3を使用停止にした影響でPerlからのツイートができなくなりました。 事前に情報を入手していなかったので「継続運用していたスクリプトがある日の午前8時以降使えない。」という症状になりました。 ツイッターがSSL/TLS両方可→TLSだけに移行、ブラウザでのツイート可、Perlでのツイート不可。

スクリプトをインチキ修正

Perlモジュールの事とか色々調べて、httpd用の「『ホスト検証をする』設定をオフにする」という技を使いツイートできるようになりました。
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
勿論クライアントが使うのはインチキです。 モジュール開発者も想定の範囲なのか、これに関連したトラブルがあったのか 「『ホスト検証オフ』はサーバー用の設定だから、クライアントは『ホスト検証オン』で使ってね」 とツイートする度にしつこく警告してきます。
*******************************************************************
 Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
 is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER
 together with SSL_ca_file|SSL_ca_path for verification.
 If you really don't want to verify the certificate and keep the
 connection open to Man-In-The-Middle attacks please set
 SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
*******************************************************************
  at C:/Perl64/lib/LWP/Protocol/http.pm line 31.

原因はNOD32のSSL検証

別件で検索したブログに「セキュリティソフトがクライアントのSSLをブロックするケースがある」と書かれています。 ウチもこの可能性があるのでNOD32のSSL検証を停止して、スクリプトのホスト検証オンで試してみるとあっさりツイートできてしまいました。 いままでの苦労はなんだったんだ…。 NOD32のSSL検証は継続、スクリプトの分は顔パス(?)して欲しいのでプログラム(Perl.exe)指定の例外を設定して、警告無しにツイートできるようになりました。

サンプルコード

文字化けしている可能性がありますのでご注意ください。 アプリケーションの登録やアカウントのアプリケーション認証は他のサイトをあたってください。 ソースの文字コードはutf8、Windows7で検証しました。
#!/usr/local/bin/perl -w

use utf8;
use strict;
use warnings;
use Encode;
use open IO => ":utf8";

binmode STDOUT, ":encoding(cp932)";

use Net::Twitter;
use Scalar::Util 'blessed';
my $nt = Net::Twitter->new(
	ssl => 1,
	traits => [qw/API::RESTv1_1/],
	consumer_key => '**********',
	consumer_secret => '**********',
	access_token => '**********',
	access_token_secret => '**********',
);

$| = 1;

eval {
	my $result = $nt->update("\@yrntrlmnmnt ツイートのテストです($$)");
};
if ($@) {
	print "ツイート失敗\n";
	my $msg = $@;
	utf8::encode($msg);
	$msg = Encode::decode('utf8', $msg);
	print "結果:$msg\n";
} else {
	print "ツイート成功\n";
}