ちょっと調べてみた。
Web サーバーが信頼する CA から発行した証明書を保有するクライアント (Webブラウザ) のみを信頼する、というのが「クライアント認証」の考え方のようだ。
ここでは、CA は自前で用意してあるものとする。
以下、以前まとめた下の関連記事の設定を前提に話を進める。
【関連記事】
PKI の認証局(CA)を構築する
【Webサーバー側】
(1) 信頼する CA の設定
まず、信頼する CA の一覧を設定する。CA から、CA 証明書 (
cacert.pem
) を受け取り、Apache に以下のように設定する。 SSLVerifyClient require
SSLCACertificateFile cacert.pem のパス
複数の CA 証明書がある場合には、ディレクトリで指定できる。
SSLVerifyClient require
SSLCACertificatePath CA 証明書の設置ディレクトリ
設定したら Apache を再起動する。
(2) 秘密鍵+証明書署名要求ファイルの作成
※この処理は、Web サーバーで行うのか、CA で行うのか、あるいはクライアント側で行うのかは、サービスの運営方針によるのではないか? と思う。クライアントの秘密鍵と証明書署名要求 (CSR) の両方を含む PEM 形式のファイルを作成する。
Country Name などに入力する値は、CA のものに合わせる。
# openssl req -new -keyout user01.pem -out user01.pem
Generating a 2048 bit RSA private key
.........+++
...+++
writing new private key to 'user01.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Shinjuku-ku
Organization Name (eg, company) [Default Company Ltd]:K-ISHIK
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:k.ishikawa
Email Address []:k-ishik@camel.zoo.park
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
なお、CA 証明書 の内容は以下のようなコマンドで表示できる。
# openssl x509 -in CA証明書ファイル -text
【CA側】
以下の (3)、(4) の手順で、PKCS #12 形式のクライアント証明書を発行する
(3) 署名付き秘密鍵ファイルの作成
作成した秘密鍵+証明書署名要求を CA にコピーし、証明書ファイルを作成する。# openssl ca -in user01.pem -keyfile /etc/pki/CA/private/cakey.pem \
-cert /etc/pki/CA/cacert.pem -out user01.crt
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 14 (0xe)
Validity
Not Before: Oct 31 15:05:37 2010 GMT
Not After : Oct 31 15:05:37 2011 GMT
Subject:
countryName = JP
stateOrProvinceName = Tokyo
organizationName = K-ISHIK
organizationalUnitName =
commonName = k.ishikawa
emailAddress = k-ishik@camel.zoo.park
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
A7:EC:D2:85:9F:59:4A:A0:B4:96:81:F6:68:5B:D8:49:69:81:7E:FA
X509v3 Authority Key Identifier:
keyid:2B:45:1F:EE:3B:DF:57:65:41:24:C9:04:53:AD:F1:B5:BA:80:D6:DA
Certificate is to be certified until Oct 31 15:05:37 2011 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
これにより、PEM 形式の証明書ファイル
user01.crt
が作成される。(4) PKCS #12 形式の証明書ファイルの作成
秘密鍵+証明書署名要求ファイルと PEM 形式の証明書ファイルから PKCS #12 形式の個人証明書を作成する。# openssl pkcs12 -export -clcerts -in user01.crt -inkey user01.pem \
-out user01.p12
Enter pass phrase for user01.pem:
Enter Export Password:
Verifying - Enter Export Password:
【クライアント側】
(5) 証明書のインポート
CA (または、Web サーバー経由で) PKCS #12 形式の個人証明書user01.p12
をクライアント PC にコピーし、ブラウザにインポートする。(以下、Internet Explorer 7 の場合)
- [ツール] メニューの [インターネットオプション] の [コンテンツ] タブで、[証明書] ボタンをクリックする。
- "証明書" 画面の [個人] タブで、[インポート] ボタンをクリックする。
- "証明書のインポート ウィザード" が起動する。[次へ] をクリックする。
- [ファイル名] 欄に個人証明書のパスを設定し、[次へ] ボタンをクリックする。
- [パスワード] 欄に、手順 (4) で入力した Export Password を入力する。
[秘密キーの保護を強力にする] にチェックを入れると、ブラウザ起動後最初に対象サイトにアクセスするたびにパスワードの入力を求められる。
[このキーをエクスポート可能にする] にチェックを入れると、"証明書" 画面でキーのエクスポートができるようになる。 - あとは、指示に従って処理する。
以上で、設定は完了。
クライアント認証するように設定した URL にアクセスすると、"デジタル証明書の選択" ダイアログが表示される。
インストールした証明書を選択して [OK] をクリックすればアクセスできる。