Ubuntu12.04のSSLがおかしいらしい 〜Ubuntu12.04 + PythonでSSL通信〜

Ubuntu12.04LTSキタコレ!

意気揚々としてUbuntu12.04にアプデしたので、とりあえずUnity、GNOME-shell、XFCE4と一通り試してみることに。

UnityはLTSになっただけあって安定してきたと思う。特にデュアルモニター周りはGNOMEにかなり追い付いてきてる様子。ただ、compiz周りが全滅なのが頂けない。またUnityもGNOME-Shellも、自分好みの最低限欲しいチューニングができなかったため、結局前と同じXFCE4に落ち着いた。XFCE4自体はさほど変化していない模様。

問題発生

ところがどうもTerminatterのUser Streamが動かない。エラーとしてはSSL認証が通らないとか何とか。Python3.2でも発生するようで、Python固有の不都合かなぁと、良く分からないこともあって放置していたのだが。

救世主としぁ(なんかメシアっぽい)現る

mikutterユーザ会オフに、別にmikutterユーザでもないのに参加したぽんこつさんだが、偶然としぁさんが同じ問題に遭遇したという話を聞く。どうやらRuby製のmikutterでも同じ症状が起こったという話でTLSにするとイイヨー!みたいなアドバイスを得る。

原因特定

という訳で本格的な調査を始めてみると、

urllib2.urlopen(https)

で落ちてることが判明した。

これは特定URLからデータを取得する時一般的な、何の変哲もないコードなのだが、Ubuntu12.04でいくらかのサイトにhttpsで繋ぐと落ちるようだ。Twitterはそこに含まれていた模様。

この影響はかなり大きい筈で、httpsを使うコードの多くが影響する。silfatterも恐らく動かなくなっている。(何故なら、このコードはsilfatterから持ってきたからだw)

解決法

問題はPythonTLS認証にする方法がよー分からんという点である。実は結局分からなかったのだが、以下のように書き換えると問題無く動いた。

handler = urllib2.HTTPSHandler()
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
urllib2.urlopen(https)

おそらくurlopenに使うopenerをHTTPS専用のものに切り替えてるだけだが、なんだか良く分からないがこれで動いたので良しとしておく。自動でTLSに切り替えてやってくれるんかな。