Apache|SSLの設定(クライアント認証)

サーバ認証 の際には、サーバから証明書を受け取り正規のサーバであることを確認します。

対して、クライアント認証 ではサーバがアクセスしてきたクライアントを正規のクライアントであるか判断します。任意の認証局が発行した証明書を持っているクライアントのみを正規のクライアントと判断します。

手順

クライアント認証を導入するための大まかな手順は以下の通りです。

  1. クライアント用秘密鍵を作成
  2. クライアント用秘密鍵をもとにCSRを作成
  3. CA(認証局)CSR を送り、証明書を発行してもらう
  4. 証明書を PKCS12形式 に変換
  5. クライアント証明書をWebブラウザにインストール
  6. apacheの設定編集

ここでは、テスト運用したいだけなので商用のCAを使わずに自己署名で証明書を作成します。

クライアント用秘密鍵を作成

ディレクトリ移動後、秘密鍵を作成します。

cd /etc/pki/tls/certs
openssl genrsa -out client.key 2048
613-web-server-ssl-client-21.png

client.key という秘密鍵がカレントディレクトリに作成されます。

クライアント用秘密鍵をもとにCSRを作成

openssl req -new -key client.key -out client.csr
613-web-server-ssl-client-211.png

client.csr というファイルがカレントディレクトリに作成されます。

クライアント証明書作成

ここではテスト用なので自己署名をして証明書を作成します。

openssl x509 -req -in client.csr -signkey client.key -days 3650 -out client.crt
613-web-server-ssl-client-22.png

client.crt という証明書がカレントディレクトリに作成されます。なお、daysを3650日と指定しているため作成された証明書は10年間有効となります。

クライアント証明書をPKCS12形式に変換

cat client.key client.crt | openssl pkcs12 -export -out client.p12 -name "My Certificate 1"
613-web-server-ssl-client-23.png

エクスポートファイルのパスワードを作成しています。このパスワードはクライアントPCにインポートするとき利用します。

client.p12 という PKCS12形式 に変換された証明書がカレントディレクトリに作成されます。

クライアント証明書をWebブラウザにインストール

作成した client.p12 をクライアントPCにダウンロードします。client.p12ファイル をダブルクリックするとインストールが開始されます。

613-web-server-ssl-client-2-20.png

後は、画面に従って進めてください。

613-web-server-ssl-client-2-21.png 613-web-server-ssl-client-2-22.png

クライアント証明書を PKCS12形式 に変換した際に作成したパスワードを入力します。

613-web-server-ssl-client-2-23.png 613-web-server-ssl-client-2-24.png 613-web-server-ssl-client-2-25.png

apacheの設定編集

/etc/httpd/conf.d/ssl.conf を修正します。

#   Certificate Authority (CA):
#   Set the CA certificate verification path where to find CA
#   certificates for client authentication or alternatively one
#   huge file containing all of them (file must be PEM encoded)
#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
 
#   Client Authentication (Type):
#   Client certificate verification type and depth.  Types are
#   none, optional, require and optional_no_ca.  Depth is a
#   number which specifies how deeply to verify the certificate
#   issuer chain before deciding the certificate is not valid.
#SSLVerifyClient require
#SSLVerifyDepth  10
#   Certificate Authority (CA):
#   Set the CA certificate verification path where to find CA
#   certificates for client authentication or alternatively one
#   huge file containing all of them (file must be PEM encoded)
SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
 
#   Client Authentication (Type):
#   Client certificate verification type and depth.  Types are
#   none, optional, require and optional_no_ca.  Depth is a
#   number which specifies how deeply to verify the certificate
#   issuer chain before deciding the certificate is not valid.
SSLVerifyClient require
SSLVerifyDepth  1
  • SSLCACertificateFile
    • クライアント証明書を発行したCAの証明書ファイルを指定。
    • クライアント証明書をCAの公開鍵で解読するため。
  • SSLVerifyClient
    • 接続時にクライアント認証を必須とするかどうかを設定。
  • SSLVerifyDepth
    • 1にするとCAに直接署名された証明書、もしくは SSLCACertificateFile で指定した証明書の CA によって署名されたクライアント証明書が許可される。

SSL接続を強制させたかったので、/etc/httpd/conf/httpd.conf に次の記述を追記。

<Directory /var/www/html>
    SSLRequireSSL
</Directory>

設定終了後、apacheを再起動させます。

service httpd restart

以上でHTTPS接続時にクライアント認証が行われるかと思います。
(SSL関連は何かと上手くいかないことが多いです。その時はエラーログを見たりネットで検索してみてください。)

IEでHTTPS接続すると次の証明書の確認画面が表示されました。

613-web-server-ssl-client-2-26.png