SSL(クライアント認証)

[サーバの実験室 Slackware]

作成 : 2003/02/19
修正 : 2003/10/13

"サーバの実験室"の検索


SSL 通信は、サーバの身元確認だけ行う一方向認証であることが多い。 クライアントの身元確認を実施することで、サーバとクライアントの双方向認証が可能になる。

前提

サーバ認証の設定が完了していること。 サーバ認証の設定については、SSL(サーバ認証)を参照。

クライアント秘密鍵の作成 --- ユーザ

openssl genrsa を実行して、クライアント秘密鍵を作成する。 -out で指定したファイル名で秘密鍵が作成される。

# cd /usr/local/ssl
# openssl genrsa -des3 -out private/client.key 1024
Generating RSA private key, 1024 bit long modulus
......++++++
......++++++
e is 65537 (0x10001)
Enter pass phrase for private/client.key: password    <--- ユーザ秘密鍵パスフレーズ
Verifying - Enter pass phrase for private/client.key: password    <--- ユーザ秘密鍵パスフレーズ

クライアント証明書要求の作成 --- ユーザ

openssl req を実行して、クライアント証明書要求を作成する。 -key でクライアント秘密鍵、-out でクライアント証明書要求を指定する。 ここで入力する情報は、クライアントの情報。

# cd /usr/local/ssl
# openssl req -new -key private/client.key -out client.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) []: web client
Email Address []: webclient@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(今回は client.cnf) のポリシーを変更すれば、この限りではない。

[ policy_match ]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

openssl 定義ファイルの作成 --- CA 管理者

openssl のデフォルト定義ファイル openssl.cnf を元に、クライアント証明書を作成するための client.cnf を作成しておく。 修正箇所は、[usr_cert] セクションの nsCertType。 後でクライアント証明書を作成するとき、-config server.cnf として定義ファイルを指定する。

...
[ usr_cert ]
...
# For normal client use this is typical
nsCertType = client, email
...

クライアント証明書の作成 --- CA 管理者

openssl ca を実行して、クライアント証明書を作成する。 -in にクライアント証明書要求、-out にクライアント証明書、-config にクライアント証明用の定義ファイルを指定する クライアント証明書は、X509 フォーマットで作成される。 クライアント公開鍵を含む情報をハッシュし、それをCA 秘密鍵で暗号化したデータを署名として付加する。

# openssl ca -in client.csr -config client.cnf -out client.crt

Using configuration from client.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 19 13:43:27 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

PKCS#12形式ファイルの作成 --- ユーザ

クライアントのブラウザに証明書をインストールするため、ユーザ秘密鍵と証明書を PKCS#12 形式に変換する。 -inkey にクライアント秘密鍵、-in にクライアント証明書、-out に PKCS#12 形式ファイルを指定する

# openssl pkcs12 -export -inkey private/client.key -in client.crt -out client.p12

Enter pass phrase for private/client.key: password    <--- ユーザ秘密鍵パスフレーズ
Enter Export Password:  password    <--- ブラウザにインストールするときに必要なパスワード
Verifying - Enter Export Password: password    <--- ブラウザにインストールするときに必要なパスワード再入力

作成した PKCS#12 形式のファイルを、クライアントのブラウザ(IE とか NN とか)にインストールする。

httpd 設定フィルの編集

httpd.conf または ssl.conf に、クライアント認証を要求するよう記述する。

クライアントを認証するには、クライアント証明書を作成した CA の公開鍵(証明書)が必要になる。 SSLCACertificateFile で、CA 証明書を指定する。

SSLCACertificateFile /usr/local/apache2/conf/ssl.crt/cacert.pem

CA 証明書ファイル /usr/local/ssl/demoCA/cacert.pem を /usr/local/apache2/conf/ssl.crt ディレクトリにコピーしておく。

# cp /usr/local/ssl/demoCA/cacert.pem /usr/local/apache2/conf/ssl.crt

SSLCACertificateFile のかわりに SSLCACertificatePath を使用して CA 証明書を置くディレクトリを指定することで、複数の CA 証明書に対応することができる。 CA 証明書をコピーするだけでなく、CA 証明書のハッシュ.0(.0 を忘れるとエラーになる)を名前とした CA 証明書へのシンボリックリンクの作成が必要。

SSLCACertificatePath /usr/local/apache2/conf/ssl.crt
# ln -s cacert.pem `openssl x509 -noout -hash -in cacert.pem`.0

SSLVerifyClient で、クライアント認証の設定をする。 SSLVerifyClient はバーチャルホストやディレクトリごとに記述できるので、サーバ認証のみで接続できるディレクトリと、双方向認証しないと接続できないディレクトリを作成することができる。

SSLVerifyClient none            # クライアント認証しない
                optional        # クライアントは証明書を提示するかもしれない、提示した場合は CA の公開鍵で認証できなければならない
                require         # クライアントは証明書を提示しなければならない
                optional_no_ca  # クライアントは証明書を提示するかもしれない、提示した場合は CA の公開鍵で認証できなくてもよい

httpd の再起動

httpd を起動して、エラーが出なければ OK。 (error_log もチェックすること)

# /usr/local/apache2/bin/apachectrl restart

[サーバの実験室 Slackware]