クライアント認証

Web ページを公開する際,コンテンツに対するアクセス制限を施したい場合がある。
例えば職場の仲間うち数人で会社の悪口なんかを遠慮せずに書き込む掲示版なんかがいい例だ。
その掲示版の存在を会社の経営陣に発見された場合には,風あたりが強くなるくらいでは済まない。
経営陣が DQN な場合はなおさら注意が必要である。

コンテンツの内容はともかく,自己署名証明書であっても目的によっては非常に便利。

■ 流れ
1. openssl の設定
2. CA の証明書生成
3. Web サーバの証明書署名要求 (CSR) 作成
4. Web サーバ証明書の署名
5. Apache の設定 (証明書の指定)
6. クライアントの証明書署名要求 (CSR) 作成
7. クライアント証明書の署名
8. 証明書の変換
9. Apache の設定 (クライアント認証)


■ 1. openssl の設定
openssl の設定ファイルの中で,CA のディレクトリを指定する。
/etc/ssl/openssl.cnf

[ CA_default ]
dir          = ./demoCA  # 認証局ディレクトリのトップディレクトリ名称

これを絶対パスで指定すると幸せになれることもある。
dir = /usr/local/dqnCA とか。

なお,ports 版の openssl を導入している場合には,
設定ファイルは /usr/local/openssl/openssl.cnf だったりするので
注意が必要である。


■ 2. CA の証明書生成
・パスの決定と準備。
# pwd
/usr/local/dqnCA
#
# touch index.txt
# echo 01 > serial
# mkdir newcerts
# mkdir private

・CA の秘密鍵と証明書の作成
# openssl req -new -x509 -days 365 -keyout private/cakey.pem -out cacert.pem
Generating a 1024 bit RSA private key
.......++++++
......++++++
writing new private key to 'private/cakey.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) [AU]:JP
State or Province Name (full name) [Some-State]:Kanagawa
Locality Name (eg, city) []:Kawasaki
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DQN
Organizational Unit Name (eg, section) []:DQN
Common Name (eg, YOUR name) []:dqnCA
Email Address []:hirowo.com@localdomain.co.jp
# 

・発行した証明書の確認
証明書の内容を確認しておく。有効期限なんかにも注意が必要。
# openssl x509 -in ファイル名 -text

・証明書のフォーマット変換
# pwd
/usr/local/dqnCA
# openssl x509 -inform pem -outform der < cacert.pem > cacert.der

・ここまでに作成されるのは以下のとおり。パーミッションを落としておく。
/usr/local/dqnCA - 認証局ディレクトリ
/usr/local/dqnCA/private/cakey.pem - 認証局の秘密鍵
/usr/local/dqnCA/cacert.pem - 自己署名型のCA証明書
/usr/local/dqnCA/cacert.der - 自己署名型のCA証明書 (der形式)


■ 3. Webサーバの証明書署名要求 (CSR) 作成
・パスの決定と準備。
# pwd
/usr/local/dqnSSLadmin
#

・Web サーバの秘密鍵と証明書署名要求の作成
# openssl req -new -keyout securekey.pem -out csr.pem
Generating a 1024 bit RSA private key
.....++++++
...........................++++++
writing new private key to 'securekey.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) [AU]:JP
State or Province Name (full name) [Some-State]:Kanagawa
Locality Name (eg, city) []:Kawasaki
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DQN
Organizational Unit Name (eg, section) []:DQN
Common Name (eg, YOUR name) []:finaldqn.mine.nu
Email Address []:hirowo.com@localdomain.co.jp

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
# 

・作成されるのは以下の通り。
/usr/local/apache/conf/ssladmin/csr.pem - サーバ管理者の証明書要求
/usr/local/apache/conf/ssladmin/securekey.pem - サーバ管理者の秘密鍵


■ 4. Web サーバ証明書の署名
・openssl 設定変更
/etc/ssl/openssl.cnf の1行のコメントを削除

# This is OK for an SSL server.
 nsCertType                     = server

・署名
# cd /usr/local/dqnCA/
# cp /usr/local/dqnSSLadmin/csr.pem ./
# openssl ca -out server_cert.pem -infiles csr.pem
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for /usr/local/dqnCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
---8<--- snip ---8<---
Certificate is to be certified until Nov 29 07:49:17 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
#

・証明書の移動
# rm csr.pem
# mv server_cert.pem /usr/local/apache/conf/ssladmin/

・作成されるのは以下の通り。
/usr/local/apache/conf/ssladmin/server_cert.pem - CA署名済サーバ証明書


■ 5. Apache の設定 (証明書の指定)
以下の2つのファイルを指定すれば良い。
/usr/local/apache/conf/ssladmin/server_cert.pem - CA署名済サーバ証明書
/usr/local/apache/conf/ssladmin/securekey.pem - サーバ管理者の秘密鍵

・秘密鍵のパスフレーズ
設定された状態では,Apache の起動時にパスフレーズの入力が必要である。
以下はそのパスフレーズを除去する作業(良いか悪いかは別として)。

# openssl rsa -in securekey.pem -out key.pem
Enter pass phrase for securekey.pem:
writing RSA key
# 

・Apache の設定変更。
httpd.conf に以下の2行を反映させる。
SSLCertificateFile /usr/local/apache/conf/ssladmin/server_cert.pem
SSLCertificateKeyFile /usr/local/apache/conf/ssladmin/key.pem

以上で,証明書を使用した Web サーバの運用が可能。


■ 6. クライアントの証明書署名要求 (CSR) 作成
・パスの決定と署名要求の作成
% pwd
/usr/home/user1
% openssl req -new -keyout privatekey.pem -out privatecsr.pem
Generating a 1024 bit RSA private key
..............++++++
........................++++++
writing new private key to 'privatekey.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) [AU]:JP
State or Province Name (full name) [Some-State]:Kanagawa
Locality Name (eg, city) []:Kawasaki
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DQN
Organizational Unit Name (eg, section) []:DQN
Common Name (eg, YOUR name) []:Hiro
Email Address []:hirowo.com@localdomain.co.jp

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
%

・作成されるのは以下の通り
privatecsr.pem -> 証明書署名要求
privatekey.pem -> 秘密鍵


7. クライアント証明書の署名
・openssl の設定
/etc/ssl/openssl.cnf の1行を変更。

# This is OK for an SSL server.
 nsCertType                     = client

・署名
# cd /usr/local/dqnCA/
# cp ~user1/privatecsr.pem ./
# openssl ca -out private_cert.pem -infiles privatecsr.pem
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for /usr/local/dqnCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:

---8<--- snip ---8<---

Certificate is to be certified until Nov 29 08:10:15 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
# 
# rm privatecsr.pem
# mv private_cert.pem ~user1/

・作成されるのは以下の通り。
private_cert.pem -> 署名済証明書


■ 8. 証明書の変換
形式変換する。CA の証明書も必要となる。
% openssl pkcs12 -export -inkey privatekey.pem -in private_cert.pem \
? -certfile cacert.pem -name user1 -out private_cert.p12
Enter pass phrase for privatekey.pem:
Enter Export Password:
Verifying - Enter Export Password:
%

・作成されるのは以下の通り。
private_cert.p12 -> pkcs12形式署名済証明書


■ 9. Apache の設定 (クライアント認証)
# cd /usr/local/apache/conf/
# cp /usr/local/dqnCA/cacert.pem ./

・httpd.conf の編集
SSLCACertificatePath /usr/local/apache/conf
SSLCACertificateFile /usr/local/apache/conf/cacert.pem

SSLVerifyClient require
SSLVerifyDepth  10

など。


■ 10. その他
・署名の際,内容が一致しないと怒られる場合の対応例
-> /etc/ssl/openssl.cnf

# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy          = policy_match

# For the CA policy
[ policy_match ]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional


・存在する秘密鍵からの署名要求の作成
% openssl req -new -key key_for_xxx.pem -out xxx_csr.pem

・ 証明書のファイル形式変換
外部 CA が署名した証明書をクライアント認証に使用するため,
CA の証明書を Apache が読めるPEM 形式に変換したことも

% openssl x509 \
 -inform der \
 -in 変換元ファイル名 \
 -outform pem \
 -out 変換先ファイル名 \




    

[Top Page]