自前の認証局_クライアント証明書の作成②

自前の認証局_クライアント証明書の作成②

では前回の続きになります。
前回は認証局とサーバー証明書を発行しました。

今回はサーバー証明書をApacheに設置し、クライアント証明書を発行いたします。


前回作成したサーバー証明書が以下になります。
SSLCertificateFile    www.crt
SSLCertificateKeyFile    www.key



6.作成したサーバー証明書を設置

今回はApacheを使う場合になります。
設置場所はお使いの設定によって異なるかと思います。

cd /etc/httpd/sslkey/

cp -ip /etc/pki/testCA/www.crt cert.crt
cp -ip /etc/pki/testCA/www.key keyin.pem



7.Apacheの設定

Apacheのconfファイルに記述を追加いたします
confファイルの場所については各環境で違うと思いますのでご確認ください。


以下の記述を追加します。


SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite AES:RC4:3DES:!EXP:!ADH:!SSLv2

#SSLCACertificateFile  /etc/httpd/sslkey/ca.crt
SSLCertificateFile    /etc/httpd/sslkey/cert.crt
SSLCertificateKeyFile /etc/httpd/sslkey/keyin.pem

SSLVerifyClient optional
SSLCACertificateFile  /etc/pki/testCA/cacert.pem
SSLCARevocationFile   /etc/pki/testCA/crl.pem
#SSLCertificateKeyFile /etc/pki/testCA/private/cakey.pem

<Directory ドキュメントルートのパス>
    Require all granted
    options FollowSymLinks ExecCGI
    AllowOverride None
    Order allow,deny
    allow from all

    SSLRequire (%{SSL_CLIENT_VERIFY} eq "SUCCESS")

</Directory>
    SetEnvIf User-Agent ".*MSIE.*" \
    nokeepalive ssl-unclean-shutdown \
    downgrade-1.0 force-response-1.0
</VirtualHost>



追加した内容の意味ですが、
上の方のSSLから始まる記述は証明書の指定と、
認証局の指定になります。

下の方の記述に関しては、今回のメインのテーマの
クライアント証明書がないとアクセスを拒否するという記述になります。



Apacheのリロードを実施します。


Apacheのconfig確認
/usr/sbin/apachectl configtest

プロセスの確認
ps auxww | grep httpd 


Apache リロード
service httpd graceful

プロセスの確認
ps auxww | grep httpd 





8.クライアント証明書の発行

最後にクライアント証明書の発行方法です。

cd /etc/pki/testCA/


openssl req -config openssl.cnf -new -keyout test.key.pem -out test.req.pem -days 3650 -extensions client_cert

test.key.pem用のパスフレーズ入力が必要です。
※適当に12桁ほどのパスワードを入力して下さい。


その後、以下のようにクライアント証明書の情報を聞いてきます。

Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:tokyo
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:利用するユーザー名
Common Name (eg, your name or your server's hostname) []:test.ca
Email Address []:

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


Organizational Unit Name は何でもいいのですが、
発行するクライアント証明書のユーザーを区別するためにユーザー名を入れます。


生成した証明書に認証局が署名
openssl ca -config openssl.cnf -policy policy_anything -out test.cert.pem -extensions client_cert -infiles test.req.pem

CAパスフレーズの入力を求めてくる
## Enter pass phrase for /etc/pki/testCA/private/cakey.pem:

CAパスフレーズは前回CAを作成した際に入力したパスフレーズになります。


Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y



index.txtがアップデートされ、一番下に以下のような行が追加されます。



V       260914073922Z           B40CB44BE5DC1674        unknown /C=JP/ST=tokyo/L=/O=/OU=ユーザー名/CN=test.ca


作成された一番下のユニット名が作成したユーザー名になっていることを確認の上、
 B40CB44BE5DC1674 を抜き出す。


# rm test.cert.pem
# mv newcerts/B40CB44BE5DC1674.pem newcerts/ユーザー名.pem (← 変更前のファイルをユーザー名.pemにリネームします)
# mv test.req.pem certs/ユーザー名.pem (← 変更前のファイルをユーザー名.pemにリネームします)
# mv test.key.pem private/ユーザー名.pem (← 変更前のファイルをユーザー名.pemにリネームします)



ユーザへ配布する .p12 ファイルを作る
# openssl pkcs12 -export -in newcerts/ユーザー名.pem -inkey private/ユーザー名.pem -certfile cacert.pem -out ユーザー名.p12


以下のようにいくつかパスフレーズを聞いてきます。

Enter pass phrase for private/ユーザー名.pem:クライアント証明書のプライベートキー用のパスフレーズを入力
Enter Export Password:ユーザが証明書を取り込む時のパスワード
Verifying - Enter Export Password:ユーザが証明書を取り込む時のパスワード


※クライアント証明書のプライベートキー用のパスフレーズは先ほど
test.key.pem用に作成したパスフレーズです。

※ユーザが証明書を取り込む時のパスワードは何でも構いません。
ただPCに取り込む際に必要になりますので、メモが必要です。



これでユーザー名.p12というクライアント証明書のファイルが作成できました!

このファイルをPC取り込み、利用するブラウザに設定をしないと、
サイトに接続できなくなります。