SSL(サーバ認証)
作成 : 2003/02/09
修正 : 2003/10/13
必要なパッケージ
openssl がインストールされていること。 インストール方法は、openssl-0.9.7を参照。 openssl コマンドについては、openssl コマンドを参照。
mod_ssl が使用可能であること。 インストール方法は、httpd-2.0.44を参照。
CAの開設 --- CA 管理者
CA(Certification Authority:認証局)は、ユーザ・サーバや下位 CA が作成した証明書要求(CSR:Certification Signing Request)に署名を行い、電子証明書を発行する。 WEB サーバで SSL を使用するには、サーバ秘密鍵とCA に署名してもらった証明書が必要になる。 サーバ証明書を発行するためのプライベートな CA を開設する。
openssl をインストールしたディレクトリ(デフォルトでは /usr/local/ssl ディレクトリ)に移動する。 misc/CA.sh -newca を実行するが、スクリプトの中で bin/openssl を呼び出しているので、/usr/local/ssl/bin にパスを通しておくこと。
# cd /usr/local/ssl # export PATH=$PATH:/usr/local/ssl/bin # misc/CA.sh -newca CA certificate filename (or enter to create) (Enter) Making CA certificate ... Generating a 1024 bit RSA private key ...........++++++ ..............................................++++++ writing new private key to './demoCA/private/./cakey.pem' Enter PEM pass phrase: password <--- CA パスフレーズ Verifying - Enter PEM pass phrase: password <--- CA パスフレーズ再入力 ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]: JP State or Province Name (full name) [Some-State]: Tokyo Locality Name (eg, city) []: Chuo-ku Organization Name (eg, company) [Internet Widgits Pty Ltd]: nina Organizational Unit Name (eg, section) []: CA Common Name (eg, YOUR name) []: nina CA Email Address []: ca@nina.jp
パスフレーズは忘れないこと! カレントディレクトリに demoCA ディレクトリが作成される。 demoCA/cacert.pem が CA 証明書、demoCA/private/cakey.pem が CA 秘密鍵になる。
サーバ秘密鍵の作成 --- サーバ管理者
openssl genrsa を実行して、サーバ秘密鍵を作成する。 -out で指定したファイル名で秘密鍵が作成される。
# cd /usr/local/ssl # openssl genrsa -des3 -out private/server.key 1024 Generating RSA private key, 1024 bit long modulus .....++++++++++++ ................................................++++++++++++ e is 65537 (0x10001) Enter pass phrase for private/server.key: password <--- サーバ秘密鍵パスフレーズ Verifying - Enter pass phrase for private/server.key: password <--- サーバ秘密鍵パスフレーズ再入力
このままでは httpd を起動するたびに、サーバ秘密鍵を作成したときに入力したパスフレーズを入力しなければならない。 セキュリティ上はよくないが、パスフレーズを削除した秘密鍵を作成するときは、次のようにする。
# cd /usr/local/ssl # bin/openssl rsa -in private/server.key -out private/server.key read RSA key Enter PEM pass phrase: password <--- サーバ秘密鍵パスフレーズ writing RSA key
または、ssl.conf の SSLPassPhraseDialog ディレクティブで、パスフレーズを STDOUT に出力する外部プログラムを指定する。
サーバ証明書要求の作成 --- サーバ管理者
openssl req を実行して、サーバ証明書要求を作成する。 -key でサーバ秘密鍵、-out でサーバ証明書要求を指定する。 サーバ証明書要求は、サーバ秘密鍵を元に作成された公開鍵を含む。
# cd /usr/local/ssl # openssl req -new -key private/server.key -out server.csr Enter pass phrase for private/server.key: password <--- サーバ秘密鍵パスフレーズ You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]: JP State or Province Name (full name) [Some-State]: Tokyo Locality Name (eg, city) []: Chuo-ku Organization Name (eg, company) [Internet Widgits Pty Ltd]: nina Organizational Unit Name (eg, section) []: web Common Name (eg, YOUR name) []: www.nina.jp Email Address []: webmaster@nina.jp Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: (Enter) An optional company name []: (Enter)
注意! Country Name、State or Province Name、Organization Name は CA 開設のとき入力したものと同じにしておくこと! 次のサーバ証明書の作成で、エラーになる。 /usr/local/ssl/openssl.cnf(今回は、server.cnf) のポリシーを変更すれば、この限りではない。
[ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional
Common Name は、httpd の ssl.conf(デフォルトでは /usr/local/apache2/conf/ssl.conf)の ServerName で指定されたものと同じにする。 サーバのホスト名とは異なってもよい。
openssl 定義ファイルの作成 --- CA 管理者
openssl のデフォルト定義ファイル openssl.cnf を元に、サーバ証明書を作成するための server.cnf を作成しておく。 修正箇所は、[usr_cert] セクションの nsCertType。 後でサーバ証明書を作成するとき、-config server.cnf として定義ファイルを指定する。
...
[ usr_cert ]
...
# This is OK for an SSL server.
nsCertType = server
...
サーバ証明書の作成 --- CA 管理者
openssl ca を実行して、サーバ証明書を作成する。 -in にサーバ証明書要求、-out にサーバ証明書、-config にサーバ証明用の定義ファイルを指定する サーバ証明書は、X509 フォーマットで作成される。 サーバ公開鍵を含む情報をハッシュし、それをCA 秘密鍵で暗号化したデータを署名として付加する。
# openssl ca -in server.csr -config server.cnf -out server.crt Using configuration from /usr/local/ssl/openssl.cnf Enter pass phrase for ./demoCA/private/cakey.pem: password <--- CA 秘密鍵パスフレーズ Check that the request matches the signature Signature ok Certificate Details: .... Certificate is to be certified until Feb 9 02:36:55 2004 GMT (365 days) Sign the certificate? [y/n]: y 1 out of 1 certificate requests certified, commit? [y/n] y Write out database with 1 new entries Data Base Updated
証明書失効リストの作成 --- CA 管理者
不正に使用された等の理由で失効した証明書の一覧である、証明書失効リストを作成する。 証明書を失効させるたびに証明書失効リストを更新して、常に最新の情報を持たせるようにしなければならない。 (証明書を失効させる方法については、openssl コマンドを参照)
-config に定義ファイル、-out で作成する証明書失効リストファイルを指定する
# openssl ca -config openssl.cnf -gencrl -out nina.crl Using configuration from /usr/local/ssl/openssl.cnf Enter pass phrase for ./demoCA/private/cakey.pem: CA パスフレーズ
CA 証明書の公開
クライアントはサーバ証明書の署名を CA 公開鍵で復号化し、ハッシュ値と比較することで認証を行う。 Verisign などでサーバ証明書を発行してもらった場合、CA 公開鍵(証明書)はブラウザにあらかじめ登録されているので、認証することができる。 自分で CA を構築した場合、CA 公開鍵(証明書)をクライアントにインストールしなければならない。
注意! CA 公開鍵がないと認証ができない。 しかし、サーバ公開鍵はサーバ証明書に含まれているため、暗号化した通信はできる。
openssl x509 で、CA 公開鍵を PEM 形式(アスキーテキスト)から DER 形式(バイナリ)に変換する。
# openssl x509 -inform PEM -outform DER -in demoCA/cacert.pem -out demoCA/cacert.der
作成した cacert.der を Web アクセス可能なディレクトリに置く。 httpd の設定ファイルに MIME タイプの指定があれば、http://xxxxx/cacert.der に接続することで CA 証明書のインストールが可能。 ssl.conf あたりに、次のような記述があれば OK。
AddType application/x-x509-ca-cert .crt .der
httpd 設定フィルの編集
httpd.conf または ssl.conf に、サーバ認証に必要な情報を記述する。
SSLCertificateKeyFile で、サーバ秘密鍵ファイルを指定する。
SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
サーバ秘密鍵ファイル /usr/local/ssl/private/server.key を /usr/local/apache2/conf/ssl.key ディレクトリにコピーしておく。 パーミッションは、root のみ読み込み可能(400)にしておく。
# cp /usr/local/ssl/private/server.key /usr/local/apache2/conf/ssl.key # chmod 400 /usr/local/apache2/conf/ssl.key
SSLCertificateFile で、サーバ証明書ファイルを指定する。
SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
サーバ証明書ファイル /usr/local/ssl/server.crt を /usr/local/apache2/conf/ssl.crt ディレクトリにコピーしておく。
# cp /usr/local/ssl/server.crt /usr/local/apache2/conf/ssl.crt
SSLCARevocationFile で、証明書失効リストファイルを指定する。
SSLCARevocationFile /usr/local/apache2/conf/ssl.crl/nina.crl
証明書失効リストファイル /usr/local/ssl/nina.crl を /usr/local/apache2/conf/ssl.crl ディレクトリにコピーしておく。 証明書失効リストファイルが更新されるたびに、コピーしなおすこと。 (ファイルをコピーするだけなら httpd の再起動は不要)
# cp /usr/local/ssl/nina.crl /usr/local/apache2/conf/ssl.crl
SSLCARevocationFile のかわりに SSLCARevocationPath を使用して、証明書失効リストを置くディレクトリを指定することで、複数の CA が作成した証明書失効リストに対応することができる。 証明書失効リストをコピーするだけでなく、証明書失効リストのハッシュ.r0(.r0 を忘れるとエラーになる)を名前とした 証明書失効リストへのシンボリックリンクの作成が必要。
SSLCARevocationPath /usr/local/apache2/conf/ssl.crl
# ln -s nina.crl `openssl crl -noout -hash -in nina.crl`.r0
httpd の起動
httpd を起動して、エラーが出なければ OK。 (error_log もチェックすること)
# /usr/local/apache2/bin/apachectrl sslstart
起動スクリプト
/etc/rc.d/rc.httpd を編集する。
#!/bin/sh
#
# Start the Apache web server
#
case "$1" in
'start')
/usr/local/apache2/bin/apachectl sslstart ;;
'stop')
/usr/local/apache2/bin/apachectl stop ;;
'restart')
/usr/local/apahce2/bin/apachectl restart ;;
*)
echo "usage $0 start|stop|restart" ;;
esac