Net: StartSSL の個人証明書を使ってクライアント認証をする

StartSSL の個人証明書と Apache を使って、SSL クライアント認証してみたメモ。

※本内容はあくまでもメモなので、認識違いなどがあるかもしれない。その場合はご指摘頂けるとありがたい。

■設定したい内容

  • StartSSL の個人証明書を用いて、特定の URL のみ SSL クライアント認証を行いたい。

今回の例では、サーバ内パス /var/www/clilentauth ディレクトリ以下については SSL クライアント認証を有効とする。それ以外は SSL でのアクセスであってもクライアント認証を求めない、と言う設定を行っているつもり。

なお、現時点での私の認識は以下の通り。

  • SSLCACertificateFile で StartSSL のルート証明書と中間証明書指定しているので、StartSSL 以外で同一メールアドレスの個人証明書を持つクライアントがアクセスしてきてもこれは拒否される。
  • SSLCARevocationFile で証明書失効リストを設定する。
  • 証明書失効リストは時々更新してあげる必要がある。(CRL の有効期限が切れると、クライアント認証に失敗するようになってしまうので、追記部分に記載の CRL のアップデートスクリプトを cron 等で自動実行させるようにしておく方が楽)

■設定

  • 認証局のルート証明書をダウンロードする

    StartSSL サイトの Tool Box 内、StartCom CA Certificates より StartCom Root CA (PEM encoded) をダウンロード。
    ※ wget で直接ダウンロードできる
    $ wget https://www.startssl.com/certs/ca.pem

  • 中間証明書をダウンロードする

    StartSSL サイトの Tool Box 内、StartCom CA Certificates より Class 1 Intermediate Client CA をダウンロード
    ※ wget で直接ダウンロードできる
    $ wget https://www.startssl.com/certs/sub.class1.client.ca.pem

  • 証明書失効リストをダウンロードする

    StartSSL サイトの Tool Box 内、StartCom CA Certificates より Server Certificate Bundle with CRLs (PEM encoded) をダウンロード
    ※ wget で直接ダウンロードできる
    $ wget https://www.startssl.com/certs/ca-bundle.pem

  • 中間証明書と認証局のルート証明書を結合

    Class 1 Intermediate Client CA 、StartCom Root CA の順番で結合。
    $ cat sub.class1.client.ca.pem ca.pem > StartCom_Root_CA.pem

  • 連結した証明書ファイルを所定のディレクトリへコピー

    # cp StartCom_Root_CA.pem /etc/ssl/certs/

  • 証明書失効リストファイルを適当な名前で所定のディレクトリへコピー

    # cp StartCom_Root_ca-bundle.pem /etc/ssl/certs/

  • apache の SSL を設定している箇所で以下を指定

    # 認証局の中間証明書とルート証明書を結合したファイルを指定
    SSLCACertificateFile /etc/ssl/certs/StartCom_Root_CA.pem

    # 認証局の証明書失効リストファイルを指定
    SSLCARevocationFile /etc/ssl/certs/StartCom_Root_ca-bundle.pem

    # SSL クライアント認証を求めるディレクトリ
    <Directory /var/www/clilentauth/>

    # SSL クライアント認証を求める
    SSLVerifyClient require

    # たどる証明書の枚数は 2 枚
    SSLVerifyDepth 2

    # クライアント証明書に含まれるメールアドレスが「メールアドレス」と一致することを要求
    #メールアドレスは、ログインさせたいクライアント証明書に含まれるメールアドレスとする。
    SSLRequire %{SSL_CLIENT_S_DN_Email} eq “メールアドレス”
    </Directory>

  • /etc/apache2/mods-available/ssl.conf

    SSLInsecureRenegotiation on
    # Mac OS X の Safari 5 では上記の設定を行わないとクライアント認証そのものが成り立たなかった。

■追記

証明書失効リストの更新を怠り、クライアント認証が一切出来ない状況が発生した。(SSL クライアント認証では、失効リストの有効期限が切れると、一切クライアント認証が出来なくなるらしい。) ので、このファイルを自動的に更新するようにスクリプトを設定する。

  • /usr/local/scripts/crl-update.sh を作成し、定期的に cron で実行する。
    以下はスクリプトのサンプル。

    #!/bin/sh

    # 証明書失効リストが公開されている URL
    CRL=”https://www.startssl.com/certs/ca-bundle.pem”
    # 証明書失効リストの一時保存先のフルパスとファイル名
    TEMPCRL=”/usr/local/scripts/tmp/StartCom_Root_ca-bundle.pem”
    # サーバ内の証明書失効リストファイルのフルパスとファイル名
    CRLFILE=”/etc/ssl/certs/StartCom_Root_ca-bundle.pem”

    wget -q ${CRL} -O ${TEMPCRL}

    if [ $? -ne 0 ]; then
            echo “Error: Cannot get CRL.”
            exit
    fi

    openssl crl -in ${TEMPCRL} > /dev/null

    if [ $? -ne 0 ]; then
            echo “Error: Broken CRL.”
            exit
    fi

    cp ${TEMPCRL} ${CRLFILE}

    if [ $? -ne 0 ]; then
            echo “Error: Cannot copy CRL.”
            exit
    fi

    /etc/init.d/apache2 reload > /dev/null

    if [ $? -ne 0 ]; then
            echo “Error: Cannot reload apache2.”
            exit
    fi