HTTPS通信とクライアント認証で、秘密鍵・公開鍵・証明書の違いがよく分からなかったので、調べてみました。自分用メモなので分かりづらいかもしれませんが、すみません。
クライアント認証の仕組み
概要
- クライアントは、サーバへhttps接続
- サーバはクライアントに、クライアント証明書を要求
- クライアントは、クライアント証明書をサーバへ送付
- そのとき、クライアント証明書をユーザが選択する
- サーバは署名されたクライアント証明書を解読しクライアントの公開鍵を取得
- クライアントは、送付メッセージにダイジェストを付加し、クライアントの持つ秘密鍵で暗号化する
- サーバは、クライアントの公開鍵を使ってメッセージを解読
- 解読したメッセージからメッセージ・ダイジェストを作成し、クライアントが付加したメッセージ・ダイジェストと比較する
- 一致が確認されれば、信頼できるクライアントから改ざんされていないメッセージを受信したと言える
※ポイント
HTTPSでのSSL通信は、秘密鍵暗号方式であるのに対し、クライアント認証は、公開鍵暗号方式。秘密鍵と公開鍵の役割が異なるので注意。
暗号方式の違いについては http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text/kagi.htm 参照
サーバはどうやってクライアントを認証するのか
サーバはクライアント証明書を持っているクライアント(例えば、他サーバにアクセスするためのクライアント証明書しか持っていないクライアント)を全て認証する訳にはいかない。任意のクライアントに対し、どの条件で照合し認証しているのか。
⇒ 照合条件は、 SSLVerifyDepth, SSLCACertificateFile で設定することができる。
SSLVerifyDepth
mod_ssl がクライアントが有効な証明書を持っていないことを決定する前に、どれくらい深く確認しなければならないか設定する。 デフォルト値は 1。
深さは、クライアント証明書を認証するのに必要な CA 証明書の最大数。 深さ 0 なら、自己署名されたクライアント証明書だけ許可される。 デフォルトである深さ 1 なら、自己署名されたクライアント証明書もしくは SSLCACertificateFile ディレクティブで指定した証明書の CA によって署名されたクライアント証明書が許可される。
SSLCACertificateFile
クライアント証明書を発行した CA の、CA 証明書ファイルを指定する。 クライアント認証で使用される。 複数の CA で発行されたクライアント証明書を使用する場合は、SSLCACertificatePath ディレクティブを使用する。
その他のディレクティブ
- SSLCARevocationFile
クライアント証明書を発行した CA の、失効証明書リストファイルを指定する。 破棄されたクライアント認証を確認するために使用される。 - SSLVerifyClient
クライアント認証のレベルを設定する。requireを指定すれば、クライアント認証が必須となる。