ぢろーらものおもちゃ箱:引っ越し後

写真付きで日記や趣味を書くならgooブログ

Internet ExplorerからのHTTPSアクセスでエラーページが表示される

2010-08-20 22:55:03 | IT(ネットワーク&セキュリティ)

以前、WebシステムでSSLを使っている環境で、クライアントのブラウザ操作中に「ページが表示できません」というメッセージが表示され、正しく処理が行われない、ということがありました。ただ、現象が発生するのは特定のクライアントで、しかも毎回失敗するわけではなく成功することもある、とのことでした。

クライアント側およびサーバ側でキャプチャしたパケットをWiresharkで見てみると、特にパケットのロストが起こっている様子はありませんでした。また、通信が失敗するときには、一定時間後にサーバ側からFIN(RST?)パケットを送り、通信を切断していることがわかりました。

こちらはお客さんが発見したのですが、マイクロソフトのナレッジベース http://support.microsoft.com/kb/305217/ja に類似する現象がありました。ほかにもhttp://www6.ocn.ne.jp/~caribou/i-mode/apache.443.html http://www.modssl.org/docs/2.8/ssl_faq.html#io-ie http://www.quikstore.com/download/ssl_timeout_problem/ssl_problem.txt などにも同様の内容が記載されてます。

要するにInternet Explorer側の問題のようです。通常、HTTP(1.1)のKeep-Aliveでは、サーバがHTTPのGETもしくはPOSTに応答してから一定時間コネクションを維持します。SSLの場合にはSSLを使っている場合、Keep-Aliveのタイムアウト後にTCP-FINとSSLのClosure Alertによってコネクションをクローズします。

しかし、あるバージョンのInternet Explorerでは、Keep-Alive機能で維持されているコネクションについて、SSL Closure AlertとTCP-FINの受信後、サーバ側のコネクションが閉じているのにもかかわらず(クライアントから)次のリクエストを送信してしまう不具合があり、サーバはRSTによりコネクションを強制切断するようです。そのときにブラウザにエラーが表示されます。

確かこのときは、マイクロソフトのナレッジにあるように「iplanetのKeep-Aliveタイムアウト値を増やす」という対応だったと記憶しています。「iplanetのタイムアウトを、InternetExplorerのデフォルトのKeep-Aliveタイムアウトである60秒よりも長くすることにより、先にInternetExplorerがタイムアウトするように取り計らう(上記は先にサーバ側がコネクションを切ろうとする場合に起こるため)」ということです。

ちなみに、他の回避策としては以下が考えられます。

・サーバでSSLv3.0を無効にし、Closure Alertが送信されないようにする
 (mod_sslの場合、ssl-unclean-shutdownの設定をする)

・クライアント側でレジストリ値”MaxConnectionsPerServer”を1に変更する
 (クライアントのレジストリをかえる必要があるので、当然のことながら不特定多数のお客様を相手にするサービスでは非現実的です)

・クライアントがInternetExplorerだとサーバ側が判断した場合に、HTTP1.0を使うことにより強制的にKeepAliveができなくなるようにする(当然、パフォーマンスは低下するはずです)

ちなみにこのとき、「Hello CilentSSL3.0かSSL2.0かにも依存するのではないか?」という話になりましたが、こちらもパケットを見てみると、実際には両方ともSSLv3.0(3.1?)を使っていました。最初「どういうこと?」と考えてしまいましたが、こちらは参考になる情報がすぐに見つかりました(http://www.oiwa.jp/~yutaka/tdiary/20050910.html )。
これもブラウザの設定をかえながらSSL(HTTPS)のパケットをWiresharkなどで取得すればわかりますが、ブラウザ側でSSLv2.0/SSLv3.0の両方が使える設定になっている場合には、SSLv2.0形式のパケットの中にSSLv3.0の情報を埋め込んで両方のバージョンに対応させているようです。なので、Wireshark上では「SSLv2.0」と表示されているようです。SSLv3.0のみの対応にした場合には、SSLv3.0形式でパケットをなげます。

いろいろなサイトで紹介されているとおり、SSLv2.0には脆弱性があるため推奨されれておらず、最近のブラウザではデフォルトで無効になっているものが多いです。( http://www.ipa.go.jp/security/vuln/documents/2005/JVN_23632449_OpenSSL.html http://www.openssl.org/news/secadv_20051011.txt など)。最近の端末であればお目にかかることはないかもしれませんが、おそらくまだ古いブラウザを使ってらっしゃる方も多いと思います。もしそうだった場合、この部分の設定には気をつけてみてください。


この記事が気に入りましたら、また、お役に立ちましたら、以下のアイコンをクリックしていただけると嬉しいです(^^)

ブログランキング・にほんブログ村へ