C#でAPNS Sandboxに接続できない
C#でAPNS Sandboxに接続できない、というか接続できなくなった。
以前は同じコードで問題なく接続できていたんだけど、10月6日あたりから接続できなくなった模様。。
コードはこんな感じ。
//Connect TcpClient apnsClient = new TcpClient(); apnsClient.Connect("gateway.sandbox.push.apple.com", 2195); //Open SSL Stream SslStream apnsStream = new SslStream(apnsClient.GetStream(), false, new RemoteCertificateValidationCallback(validateServerCertificate), new LocalCertificateSelectionCallback(selectLocalCertificate)); apnsStream.AuthenticateAsClient("gateway.sandbox.push.apple.com", certificates, System.Security.Authentication.SslProtocols.Ssl3, false);
SslStream.AuthenticateAsClient()でIOException発生、「トランスポート ストリームから予期しない EOF または 0 バイトを受信しました。」とかいわれちゃう。
Sandbox環境だし、メンテでもしてるのかな~とその時は放置。
そして本日10月21日、再度Sandboxに接続を試みるも、やっぱり同じエラー。。
こんなに長い間つながんないのもおかしいな~と、いろいろググってみるも目ぼしい情報もなし。。
そんな中で、Twitterで下記のツイートを発見。
APNSのSandboxに対するハンドシェークエラーは、これの対策なのかもしれない。http://t.co/Clh9OmIRnV
— marvelph (@marvelph) 2014, 10月 15
そういえばPOODLE問題、各所で話題になってるよな~、と思いながら思い当たるフシが!
SslStream.AuthenticateAsClient()の引数でプロトコルを指定してるじゃありませんか!
プロトコルの指定をSystem.Security.Authentication.SslProtocols.Ssl3から、System.Security.Authentication.SslProtocols.Tlsにかえてみたところ、無事Sandboxに接続できました♪
ちなみに10月21日現在、Production環境でのAPNS接続は修正前のコードでも動作しています。
いずれProduction環境でもSSL3だと接続できなくなるのでしょうかねー。
でもこのSSLのPOODLE問題って、10月14日に発表されてますよね?
Sandboxに接続できなくなったタイミングはそれより前の10月6日あたり。。
なんでですかねー???
(2014/10/23追記)
Appleより、10/29を持ってProduction環境でもSSL3のサポートをやめるとのアナウンスがありました。
Update to the Apple Push Notification Service - News and Updates - Apple Developer
こちらも参考に。