SSL(サーバ認証)

[サーバの実験室 Slackware]

作成 : 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

[サーバの実験室 Slackware]