RSS

SSL証明書でクライアント認証をする

Apacheを使ってSSL証明書を使ってクライアント認証の実験をした。

まず次のものを用意する。

  • CA証明書
  • サーバSSL証明書 (PEMとKeyファイル)
  • クライアント証明書 (PKCS12)

一々手で用意するのも面倒なので TinyCA を使って作成した。TinyCAの使い方は省略。

クライアント証明書認証の概念をおおざっぱに説明すると サーバ側にクライアント証明書を見せて、サーバが証明書が正しい(CAに署名されている)ことを確認して、接続を許可するという流れになる。通常のSSL接続の設定に比べると、サーバ側にCA証明書の設定が必要になる。

サーバSSL証明書の設定

まずは通常のApache+SSLの設定をする。あまり詳細な説明はしない。他を参照すること。mod_sslを導入した上で設定ファイルを書く。この時点でPEMとKeyファイルをサーバにコピーした上で設定が必要となる。

SSLCertificateFile    /etc/ssl/apache/ssl-cert-ssltest.pem
SSLCertificateKeyFile /etc/ssl/apache/ssl-cert-ssltest.der

この時点でブラウザで接続すると通常は証明書が信頼できない云々のエラーが出る。そこでブラウザ側にCA証明書をインストールする。手順は略。ただし、この手順はセキュリティ的には書いてあったからそのままやるとか思ってると将来大変なことになるので注意。

この状態で接続するとSSL証明書に関するエラーは出なくなる。

クライアント証明書の設定

サーバ側にCA証明書をコピーする。これをApacheに設定した上でSSL証明書接続を要求する設定も追加する。

SSLCACertificateFile /etc/ssl/apache/SSLTESTCA-cacert.pem
SSLVerifyClient require

この状態で接続しようとしても接続できないことを確認する。

次にクライアント証明書をブラウザ側でインポートする。そのあと接続するとクライアント証明書を提示することの確認などがされて無事接続される。

環境変数のSSL_CLIENT_S_DN_CNに CommonName が入っている。これを利用してユーザーの確認をすればいい。