IIS を利用してクライアント認証を構築するテストをしていたのですが、その過程でちょっと躓いたので情報を書き留めておきたいと思います。
どういったところで躓いたかというと、設定したテスト環境が ADFS と同居していたため CTL (証明書信頼リスト)が標準状態と異なっていたというところでした。
が、この過程でチェックした観点はほかのケースでも役に立ちそうです。
まず起きる事象から。
クライアント証明書を受けるように IIS を設定した後、サイトへアクセスすると以下のように証明書の選択が出てきます。( IE を使っている場合は選択画面が出ない設定を行っている場合もあります)
選択すると 403 エラーが表示される。といった状態になります。
IISのログを見ると以下のように 403 16 というエラーコードが表示されます。
IIS で失敗した要求トレースの規則の設定を行っておき、ログを見てみると、、、
信頼プロバイダーが信頼していないルート証明書で強制終了された旨が記されています。
一般的にこのケースは以下の docs にもあるように、証明書ストア内の信頼されたルート証明機関からルート証明以外を削除するという方法で回避できます。
それ以外はレジストリの設定でも回避できることが記載されていますね。
ただ、今回のケースでは上記設定を見直しても何ともならなかったのです。
403.16 なので、証明書の確認に失敗していることは明らかなので、さらに調査を進めたところ、以下のコマンドにヒントがありました。
netsh http show sslcert
IP アドレスでの接続( 0.0.0.0:443 )では Ctl ストア名は null となっていますが、、、
ホスト名でのアクセスでは Ctl ストア名に AdfsTrustedDevices となっていました。
これが原因か!ということで証明書ストアをチェック!
(チェック対象がローカルコンピューターとなっていることを忘れないようにしましょう)
AdfsTrustedDevices のフォルダー内にはやはりクライアント証明書に対するルート証明書が入っていなかったのです。
信頼されたルート証明機関から該当証明書をコピーしてみましょう。
すると今度はアクセスまでこぎつけることができました。
ADFS の場合、この証明書ストア内の証明書は定期的にチェックされ、手動で入れたものは消えてしまうようなのですが 403.16 のエラーが出た場合は同様の確認を行ってみるとよいかもしれません。
音楽:いにしえの瞳