coLinux日記

coLinuxはフリーソフトを種として、よろずのシステムとぞなれりける。

OpenSSLについて その5

2007-02-12 08:52:45 | OpenSSL
長い間 coLinux で OpenSSL 0.9.8a をいろいろ試してきましたが、ついでにクライアント認証もしてみます。SSL:クライアント認証が参考になります。これも、openssl.cnf を修正する必要がありそうです。この場合は、
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 については一応完了です。

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« OpenSSLについて その4 | トップ | Apache httpd 2.2.4でWebDAV ... »
最新の画像もっと見る

コメントを投稿

OpenSSL」カテゴリの最新記事