tamuraです。
前回、オレオレ認証局でサーバ証明書に署名してもらい、Apacheに組み込みました。 今回は、クライアントの証明書を作り、オレオレ認証局で署名してもらいます。 最終的にはブラウザに組み込んで使います。 署名までの手順はサーバ証明書の場合とほぼ同じです。
クライアント用のOpenSSLの設定
既存の設定ファイルを元に、クライアント向けの設定ファイルを作ります。
[root@il-sus-web-www2 ~]# cp -p /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl-client.cnf
[root@il-sus-web-www2 ~]# vi /etc/pki/tls/openssl-client.cnf
165行目から始まる [ usr_cert ]
セクションの中の180行目付近
# For an object signing certificate this would be used.
# nsCertType = objsign
# For normal client use this is typical
# nsCertType = client, email
# and for everything including object signing:
# nsCertType = client, email, objsign
ここの一番したの行のコメントをはずします。
# and for everything including object signing:
nsCertType = client, email, objsign
秘密鍵の作成
クライアントの秘密鍵を作ります。
[root@il-sus-web-www2 ~]# mkdir /etc/pki/client
[root@il-sus-web-www2 ~]# cd /etc/pki/client
[root@il-sus-web-www2 client]# openssl genrsa -out tamurashingo.key -aes256 2048
Generating RSA private key, 2048 bit long modulus
.......+++
............................................+++
e is 65537 (0x10001)
Enter pass phrase for tamurashingo.key:
Verifying - Enter pass phrase for tamurashingo.key:
クライアント用証明書作成用リクエストファイルの作成
サーバのときと同じようにCSRファイルを作成します。
オプションに -config /etc/pki/tls/openssl-client.cnf
をつけてCSRファイルを作成します。
[root@il-sus-web-www2 client]# openssl req -new -key tamurashingo.key -out tamurashingo.csr -config /etc/pki/tls/openssl-client.cnf
Enter pass phrase for tamurashingo.key:
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
Organization Name (eg, company) [Default Company Ltd]:il-sus-web
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:tamurashingo # ここで個人を判別します
Email Address []:xxxxxxxxxxx
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
CA(オレオレ認証局)による署名
オレオレ認証局で署名を行います。
[root@il-sus-web-www2 client]# openssl ca -in tamurashingo.csr -keyfile /etc/pki/CA/private/cakey.pem -cert /etc/pki/CA/cacert.pem -out tamurashingo.crt -config /etc/pki/tls/openssl-client.cnf
Using configuration from /etc/pki/tls/openssl-client.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 15711698583568785535 (0xda0b2a9e1ba0207f)
Validity
Not Before: Jul 27 06:10:35 2016 GMT
Not After : Jul 27 06:10:35 2017 GMT
Subject:
countryName = JP
stateOrProvinceName = Tokyo
organizationName = il-sus-web
commonName = tamurashingo
emailAddress = xxxxxxxxxxxxxxxxxxxxxxxxx
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client, S/MIME, Object Signing
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
A7:42:B0:CF:3D:1A:4C:D3:BF:39:48:8A:AE:F5:4B:2C:97:2B:20:62
X509v3 Authority Key Identifier:
keyid:65:2D:A0:29:6D:29:7B:B7:FD:F7:25:D7:87:78:3F:F9:26:CE:5E:16
Certificate is to be certified until Jul 27 06:10:35 2017 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
署名できました。
個人情報交換ファイル(PKCS12)の作成
署名されたCRTファイルと秘密鍵をPKCS#12フォーマットに変換します。
[root@il-sus-web-www2 client]# openssl pkcs12 -export -in tamurashingo.crt -inkey tamurashingo.key -certfile /etc/pki/CA/cacert.pem -out tamurashingo.p12 -name "www2.il-sus-web.net"
Enter pass phrase for tamurashingo.key:(秘密鍵のパスワード)
Enter Export Password:(tamurashingo.p12にかけるパスワード)
Verifying - Enter Export Password:(確認のためもう一回)
これでできました。
ブラウザへのインポート
作成したp12ファイルを何らかの方法でローカル環境に持ってきてブラウザに証明書を入れ込みます。
セキュリティ → 証明書の管理
などからできると思います。
Apacheへの組み込み
クライアント証明書を持つ人だけがアクセスできるページを作ってみます。
[root@il-sus-web-www2 client]# vi /etc/httpd/conf.d/ssl.conf
前回追加したあたりに以下の内容を追加します。
<Location /test/>
SSLVerifyClient require
SSLVerifyDepth 10
Satisfy Any
Allow from All
SSLRequire \
( \
%{SSL_CLIENT_S_DN_CN} eq "tamurashingo" \
)
</Location>
commonName
がtamurashingo
の場合に /test/
にアクセスできるようにしています。
実際にブラウザからつないでみます。
Firefoxの場合、以下のようなダイアログが出るので証明書を選択してアクセスします。
証明書を入れていないブラウザからは、ERR_SSL_PROTOCOL_ERROR
でアクセスができません。
ユーザの追加/削除
Apacheの設定ファイルにcommonName
を追加、または削除を行います。
<Location /test/>
SSLVerifyClient require
SSLVerifyDepth 10
Satisfy Any
Allow from All
SSLRequire \
( \
%{SSL_CLIENT_S_DN_CN} eq "tamurashingo" \
or %{SSL_CLIENT_S_DN_CN} qe "yamadataro" \
)
</Location>
うまくいかない場合
ログレベルを詳細に出力するモードに変更し、ログを参照します。
ログレベルの変更
通常はwarn
になっているので、debug
にします。
[root@il-sus-web-www2 ~]# vi /etc/httpd/conf.d/ssl.conf
66行目付近のログレベルを変更します。
# Use separate log files for the SSL virtual host; note that LogLevel
# is not inherited from httpd.conf.
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
#LogLevel warn
LogLevel debug
再起動します。
[root@il-sus-web-www2 ~]# service httpd restart
ログの確認
[root@il-sus-web-www2 ~]# tail -f /var/
ログを確認して原因を突き止めます。