今朝、Twitter や Facebook が SSL 3.0 を素早く無効化したため、API を使って処理を行っていたアプリが全滅するという悲惨な出来事が発生しました。
Twitter や Facebook の API を使っている場合、Global.asax.cs とかの初期化コードに以下のような設定を書いていると、接続を確立出来ないので死にます。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
実際に twitter.com へアクセスするコードを書くと、見事に例外が投げられます。
SSL 3.0 は無効化されているので、チャネルを作れないのは当たり前と言えば当たり前です。
ちなみに SecurityProtocolType.Ssl3 以外を指定している場合には成功します。
当然ながら、何も指定していない場合にも成功します。
何でわざわざ SecurityProtocolType.Ssl3 を指定していたかですが、ちょっと前に Windows 8.1 プレビュー版で Twitter クライアントが動かなくなった時に、SecurityProtocol を明示的に指定する必要があったようです。
707 + // Windows 8.1の場合SecurityProtocolを明確に指定する必要がある
http://sourceforge.jp/projects/opentween/scm/git/open-tween/commits/f6d988eb3ba144e1aa903a6803c89cc6f537c561
708 + var osVersion = Environment.OSVersion.Version;
709 + if (osVersion.Major == 6 && osVersion.Minor == 2)
710 + {
711 + ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
712 + }
コミットしたのは酢酸先生だったことに関係ないけど驚き。今は指定する必要ないみたいですが、その時のコードが残っていた場合に今回の影響を受けたようです。
自分の場合は SecurityProtocol を指定していない場合に SSL/TLS チャネルの作成に失敗するケースがあり、その時に何か調べてこのコードを入れたっぽいです。
https://twittercommunity.com/t/intermittent-error-setting-up-ssl-connection/12529
多分、このあたりのディスカッションを見た記憶があります。
結局のところ OS に任せておけばよかったということです。何でよりにもよって SSL 3.0 を指定するコードが流行ったのかは分かりません。