クライアント認証で大ハマり

 とあるところに CentOS で構築した Web サーバを収めました。それは、LAN 内からしかアクセスできないのですが、そこの決まりでクライアント認証をしなければならなかったのでかように設定をしました。

 ところが最近、これにつながらなくなりましてさあ大変。

 まったく原因がわかりませんでした。

現象1 Linux からはつながる

 このサーバ自身に入れておいた Firefox からは接続することができました。でも、お客様が使っているのは Windows。ここかはらなぜかアクセスできない。ブラウザは IE7Firefox 3.0.x でも試してみたけどダメ。

現象2 再現できない(と思ってた)

 仕方がないので、似たような環境を自社内に構築して確かめてみたら。上手くいく。と思っていたけど、試していたのは証明書と LAN 用に構築した CA のみで、ディレクトリ構造などは二の次にしておりまして、ディレクトリ構造も真似てみたら再現できました。

再現方法確定

 Location ディレクティブでクライアント認証が必要なところを限定すると上手くいかないということが発覚。Googlability を挙げるために /etc/httpd/conf.d/ssl.conf の断片を載せときます。

<Location "/hoge/">
    SSLVerifyClient require
    SSLVerifyDepth 1
</Location>

そして解決へ

 どうも再ネゴシエーション脆弱性対応のため、サーバ側にあたったアップデートが原因らしい。そのため、RFC 5746 非対応のブラウザでは接続できなくなっていたようです。ということで、ブラウザを変えられない膠着した組織ではサーバ側でこの脆弱性対応をあえて無効にしなければ従来のように接続させることはできません。次の一文を /etc/httpd/conf.d/ssl.conf に書きましょう。

SSLInsecureRenegotiation on

その名のとおり「安全でない再ネゴシエーション」です。ご利用の際は十分な了解を得ましょう。