長い間 coLinux で OpenSSL 0.9.8a をいろいろ試してきましたが、ついでにクライアント認証もしてみます。SSL:クライアント認証が参考になります。これも、openssl.cnf を修正する必要がありそうです。この場合は、
らしいです。
この client は、クライアント認証のように自分(この証明書を持っていて相手に送りつける)はクライアントであるという意味みたいですね。それでサーバ用の証明書は自分はサーバであるから server で、自己認証型の証明書は自分は認証局なので sslCA ということみたいです。本当かどうかはともかく一応納得しました。
httpd のバージョンアップを考えて、ここではキーの置く場所は独立していたほうが良いので、
としてCA、サーバ関係、クライアント用は独立して入れるようにします。書いてありませんが、コピーが終わったらキー関係はすべて消しました。
準備ができたので早速クライアント用の秘密鍵とCAで署名した証明書を作ります。
まず、openssl.cnf の[ usr_cert ] セクションを修正します。
最後の keyUsage は、最初からこのようにコメントになっているものですが、問題になってからはずすことにします。ここでは参考までに書いてあるだけです。秘密鍵と証明書の作成する openssl req と openssl ca は、CA.sh -newreq と CA.sh -sign と同じものですからこれを利用します。
これで、秘密鍵 newkey.pem と 証明書 newcert.pem が作成されました。newreq.pem はCSRなので消しても良いです。
クライアント用証明書は、Windows では PKCS#12 形式にする必要があるそうなので変換します。
設定する人には、newclient.p12 を渡してクライアント用証明書のパスフレーズを教えます。
後は Windows 上でインポートすればここで生成した秘密鍵などはサーバ側では必要ないみたいなので、ほかに見えないように、ディレクトリ key1 を 0700 にしておきます。
Apache httpd 2.2.4 用の設定の修正は、/usr/local/httpd224/conf/extra/httpd-ssl.conf 内で、
のようにしました。最後の10は最初からコメントに書いてあったとおりです。
これで最初に証明書がない場合を試したところ、Internet Explorer では、「デジタル証明書の選択」ウィンドウが表示されてページが開けませんでした。
先ほどの newclient.p12 は、Windows では、Personal Information Exchange として表示されます。このファイルを右クリックすると「PFXのインストール」メニューがでますのでこれをクリックします。途中 newclient.p12 作成したパスワードを聞かれます。もう一度ブラウザで見ると、「デジタル証明書の選択」ウィンドウの名前と発行者に証明書が現れて「OK」をクリックするとページが参照できました。そのとき、鍵アイコンをクリックして表示される証明書は、SSLCertificateFile で指定した証明書でした。他の人がこのPC を使っても見えないようにする場合は、毎回パスフレーズを入力するようにもできます。
FireFox では newclient.p12 をインポートしていなければ、-12227 エラーになりました。そこで、newclient.p12 を「証明書マネージャ」→「あなたの証明書」でインポートしました。そのときパスワードを聞いてきます。2つ聞いてきますが適当に入力したので覚えていません。
ここでわざと登録してある「認証局証明書」を削除すると newclient.p12 の「用途」が不明になり、原因不明の問題により、.... のが表示されますが、「認証局証明書」がインポートしてあると「用途」がクライアントになり「SSLクライアント証明書」として認識されました。
また証明書の失効は、
証明書の失効とCRLの発行http://www.daily-labo.com/ygg16_4.htmlを参考にすればよさそうです。早速ためしてみます。
Apache httpd に CRLを指定するため、/usr/local/httpd224/conf/extra/httpd-ssl.conf の修正をします。
これで、newclient.p12 をインポートしたブラウザでもアクセスできなくなります。もちろん新しいクライアント証明書があれば再び見られるようなりました。
おまけで、SSLCARevocationPath を指定する場合は、ハッシュ値のファイル名が必要らしいです。その場合は以下のようにするそうです。
しかし、これを試してもうまくいかなかったので、ご利用の際は必ず確認してください。
今回で OpenSSL については一応完了です。
basicConstraints = CA:FALSE nsCertType = client, email
らしいです。
この client は、クライアント認証のように自分(この証明書を持っていて相手に送りつける)はクライアントであるという意味みたいですね。それでサーバ用の証明書は自分はサーバであるから server で、自己認証型の証明書は自分は認証局なので sslCA ということみたいです。本当かどうかはともかく一応納得しました。
httpd のバージョンアップを考えて、ここではキーの置く場所は独立していたほうが良いので、
# mkdir /usr/local/keys # mkdir /usr/local/keys/CA # mkdir /usr/local/keys/server # mkdir /usr/local/keys/key1
としてCA、サーバ関係、クライアント用は独立して入れるようにします。書いてありませんが、コピーが終わったらキー関係はすべて消しました。
# cd /usr/local/httpd224/conf # mv server.crt /usr/local/keys/server/server.crt # mv server.key /usr/local/keys/server/servernp.key # cp /usr/local/CA/cacert.pem /usr/local/keys/CA/cacert.crt #
準備ができたので早速クライアント用の秘密鍵とCAで署名した証明書を作ります。
まず、openssl.cnf の[ usr_cert ] セクションを修正します。
basicConstraints=CA:FALSE nsCertType = client, email # keyUsage = nonRepudiation, digitalSignature, keyEncipherment
最後の keyUsage は、最初からこのようにコメントになっているものですが、問題になってからはずすことにします。ここでは参考までに書いてあるだけです。秘密鍵と証明書の作成する openssl req と openssl ca は、CA.sh -newreq と CA.sh -sign と同じものですからこれを利用します。
# cd /usr/local/keys/key1 # /etc/pki/tls/misc/CA.sh -newreq ........... 秘密鍵のパスフレーズを設定 # /etc/pki/tls/misc/CA.sh -sign ........... CAのパスフレーズを入力
これで、秘密鍵 newkey.pem と 証明書 newcert.pem が作成されました。newreq.pem はCSRなので消しても良いです。
クライアント用証明書は、Windows では PKCS#12 形式にする必要があるそうなので変換します。
# openssl pkcs12 -export -clcerts -inkey newkey.pem -in newcert.pem -out newclient.p12 ................ 秘密鍵のパスフレーズを入力 ................ クライアント用証明書のパスワードを設定 #
設定する人には、newclient.p12 を渡してクライアント用証明書のパスフレーズを教えます。
後は Windows 上でインポートすればここで生成した秘密鍵などはサーバ側では必要ないみたいなので、ほかに見えないように、ディレクトリ key1 を 0700 にしておきます。
Apache httpd 2.2.4 用の設定の修正は、/usr/local/httpd224/conf/extra/httpd-ssl.conf 内で、
SSLCertificateFile /usr/local/keys/server/server.crt SSLCertificateKeyFile /usr/local/keys/server/servernp.key SSLCACertificatePath /usr/local/keys/CA/ SSLCACertificateFile /usr/local/keys/CA/cacert.crt SSLVerifyClient require SSLVerifyDepth 10
のようにしました。最後の10は最初からコメントに書いてあったとおりです。
これで最初に証明書がない場合を試したところ、Internet Explorer では、「デジタル証明書の選択」ウィンドウが表示されてページが開けませんでした。
先ほどの newclient.p12 は、Windows では、Personal Information Exchange として表示されます。このファイルを右クリックすると「PFXのインストール」メニューがでますのでこれをクリックします。途中 newclient.p12 作成したパスワードを聞かれます。もう一度ブラウザで見ると、「デジタル証明書の選択」ウィンドウの名前と発行者に証明書が現れて「OK」をクリックするとページが参照できました。そのとき、鍵アイコンをクリックして表示される証明書は、SSLCertificateFile で指定した証明書でした。他の人がこのPC を使っても見えないようにする場合は、毎回パスフレーズを入力するようにもできます。
FireFox では newclient.p12 をインポートしていなければ、-12227 エラーになりました。そこで、newclient.p12 を「証明書マネージャ」→「あなたの証明書」でインポートしました。そのときパスワードを聞いてきます。2つ聞いてきますが適当に入力したので覚えていません。
ここでわざと登録してある「認証局証明書」を削除すると newclient.p12 の「用途」が不明になり、原因不明の問題により、.... のが表示されますが、「認証局証明書」がインポートしてあると「用途」がクライアントになり「SSLクライアント証明書」として認識されました。
また証明書の失効は、
証明書の失効とCRLの発行http://www.daily-labo.com/ygg16_4.htmlを参考にすればよさそうです。早速ためしてみます。
# echo '00' >/usr/local/CA/crlnumber ( crlnumber ファイルがないときだけ作成する。 ) # cd /usr/local/keys/key1 # openssl ca -gencrl -revoke newcert.pem .............. CA のパスフレーズを入力 # cd /usr/local/CA # openssl ca -gencrl -out key1-crl.pem .............. CA のパスフレーズを入力 # mkdir /usr/local/keys/crl # cp key1-crl.pem /usr/local/keys/crl/key1-crl.pem
Apache httpd に CRLを指定するため、/usr/local/httpd224/conf/extra/httpd-ssl.conf の修正をします。
SSLCARevocationFile /usr/local/keys/crl/key1-crl.pem
これで、newclient.p12 をインポートしたブラウザでもアクセスできなくなります。もちろん新しいクライアント証明書があれば再び見られるようなりました。
おまけで、SSLCARevocationPath を指定する場合は、ハッシュ値のファイル名が必要らしいです。その場合は以下のようにするそうです。
ln -s cacert.crt `openssl x509 -noout -hash < cacert.crt`.0
しかし、これを試してもうまくいかなかったので、ご利用の際は必ず確認してください。
今回で OpenSSL については一応完了です。
※コメント投稿者のブログIDはブログ作成者のみに通知されます