SSL用証明書の作成(Linux編)

先日のこと、TigerMac OS X Serverにて自前認証局+クライアント証明書による認証を設定する必要が有り、その際に参考にさせて頂いたページ。
当然、アップル - サーバ - 製品ドキュメント の最低でも『Webテクノロジー〜』と『メールサービス〜』には目を通しておくこと。


実際にはMac OS X Server固有の事情も加え、以下の様な手順で作業をしてみた。
とゆーか、自分でクライアント証明書による認証を設定したのはMacだろうとなかろうと初めてだったり。

【 クライアント認証対応手順】

以下、詳細な手順は
http://www.aconus.com/~oyaji/www/certs_linux.htm
を参考に。

◎サーバ内作業

◆◆◆◆◆サーバ証明書関連作業

■証明書作業用ディレクトリの作成

$ sudo -s
# cd Documents
# mkdir certs
# cd certs

■プライベートCAの作成
○openssl.cnfをサーバ証明書が発行できるように修正

# pushd /System/Library/Openssl/
# cp openssl.cnf openssl.cnf.orig
# vi openssl.cnf
# diff -U0 openssl.cnf.orig openssl.cnf
--- openssl.cnf.orig    2005-11-28 00:58:48.000000000 +0900
+++ openssl.cnf 2005-11-28 01:01:31.000000000 +0900
@@ -172 +172 @@
-# nsCertType                   = server
+nsCertType                     = server
@@ -241 +241 @@
-# nsCertType = sslCA, emailCA
+nsCertType = sslCA, emailCA

# popd

○CA.sh -newca によるプライベートCAの構築
# /System/Library/OpenSSL/misc/CA.sh -newca

■サーバ証明書の作成
○openssl コマンドを用いたサーバ用秘密鍵の作成
# openssl genrsa -out server.key 1024

○openssl コマンドを用いたサーバ用証明書要求(CSR)の作成
# openssl req -new -key server.key -out server.csr

○openssl コマンドを用いたサーバ用証明書の作成
# openssl x509 -CA ./demoCA/cacert.pem -CAkey ./demoCA/private/cakey.pem -CAserial ./demoCA/serial -req -days 365 -in server.csr -out server.crt

■サーバ証明書を、Mac OS X Serverの「サーバ管理へ取り込み」
○「サーバ管理」->「設定」->「証明書」->「読み込み...」から上記で生成したファイルを読み込み

# ls -l /etc/certificate/


◆◆◆◆◆クライアント証明書関連作業
■クライアント証明書の作成
○openssl.cnfをNetscape系のクライアント証明書に対応するよう修正

# pushd /System/Library/Openssl/
# cp openssl.cnf openssl.cnf.server
# vi openssl.cnf

# diff -U0 openssl.cnf.server openssl.cnf
--- openssl.cnf.server  2005-11-28 01:57:31.000000000 +0900
+++ openssl.cnf 2005-11-28 01:58:06.000000000 +0900
@@ -172 +172 @@
-nsCertType                     = server
+# nsCertType                   = server
@@ -178 +178 @@
-# nsCertType = client, email
+nsCertType = client, email

# popd

○クライアント認証使用者一覧のリストに基づいて、証明書バックアップ用ディレクトリを作成
# cd ./demoCA/certs/
# mkdir hoge huga honya hoe 
# cd ../../

○pkcs12形式の証明書を、CA証明書を含んで、CA.sh にて一人ひとり生成
(クライアント認証使用者一覧のリストに基づく)
※CA.sh を用いた生成では、一人ひとりの証明書を生成するたびにバックアップすること
※テスト用のクライアント証明書も数枚発行しておく

・-newreqする
# /System/Library/OpenSSL/misc/CA.sh -newreq

・-signする
# /System/Library/OpenSSL/misc/CA.sh -sign  
<略>
Sign the certificate? [y/n]:y
<略>
1 out of 1 certificate requests certified, commit? [y/n]y

・鍵込みでpkcs12形式にて書き出し
# openssl pkcs12 -export -inkey newreq.pem -in newcert.pem -certfile ./demoCA/cacert.pem -out .p12 -name "" -caname "hoge"

# mv ./new* ./demoCA/certs/
# mv *.p12 ./demoCA/certs/

※以上をリストの人数分繰り返し。


■クライアント証明書をまとめておく

# mkdir cl-certs
# cd ./demoCA/certs/
# find . -name "*.p12" -exec cp {} ~/Documents/cl-certs/ ¥;
# cd ../../
# tar czf cl-certs.tgz cl-certs


◆◆◆◆◆Apache関連作業

■Apacheへサーバ証明書を適用してHTTPS化
○「サーバ管理」->「Web」->「設定」->「サイト」にてVirtual Hostを追加
○Virtual Hostの設定を編集 ->「セキュリティ」->「SSLを使用する」
○証明書を取り込み
○保存して、HTTPSを有効にする

■サーバ用証明書と秘密鍵、CA証明書を/etc/httpd/以下にコピー
# cd ~/Documents/certs/
# cp ./server.crt /etc/httpd/ssl.crt/
# cp ./server.key /etc/httpd/ssl.key/
# cp ./demoCA/cacert.pem /etc/httpd/ssl.crt/ca.crt


■httpd.confにクライアント証明書を使用する設定を追加
# cd /etc/httpd/sites/
# vi hoge

        <IfModule mod_ssl.c>
                SSLEngine On
                SSLLog "/var/log/httpd/ssl_engine_log"
                SSLCipherSuite "ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:!SSLv2:+EXP:+eNULL"
                SSLCertificateFile "/etc/certificates/hogehoge.crt"
                SSLCertificateKeyFile "/etc/certificates/hogehoge.key"
                SSLVerifyClient 2
                SSLCACertificateFile "/etc/httpd/ssl.crt/ca.crt"
        </IfModule>


※「サーバ管理」でApacheの設定をコネコネするのはあまり好きではありません…

■Apacheの再起動
# apachectl configtest
# apachectl restart


◎サーバ外作業

◆◆◆◆◆NATルータ兼Firewall上での作業
■NATルールとして、443/tcp を対象サーバにポートフォワード
■フィルタルールとして、443/tcp を allow any to 対象サーバ で追加
■その他、まぁよしなに


◆◆◆◆◆クライアント側手順
■テスト用の端末にて、https://サーバ/ へアクセス
 → 一度サーバ上でクライアント認証をオフにして、HTTPSのサーバにアクセスできるのを確認
 → 再度サーバ上でクライアント認証をオンにする
 → クライアント証明書をまだ取り込んでいないのでテスト端末側では見れないのを確認
■テスト端末に、クライアント証明書を取り込み
 → 取り込み後に再度アクセスし、閲覧できる事を確認