CAの構築
OpenSSLを使用してCAを構築してみた.
本頁では,OpenSSLを使用してCAを構築してみる.
より具体的には,以下のような作業をする.
- OpenSSLを使用した証明書発行環境を構築する(CAの構築).
- CSRを作成する.
- 構築したCAにて証明書を発行する.
- 構築したCAにて発行したCRLを失効する.
- CRLを作成する.
まず,OpenSSLをインストールし,作業ディレクトリを作成する.
OpenSSLのコマンドはopensslだが,いろいろと難しいので,
# apt-get install openssl
$ mkdir -p ~/openssl/{ca,server,client}
openssl_0.9.7e-3_i386.debがインストールされた.
作成した作業ディレクトリは以下の用途で使用する.
- ~/openssl/ca
- 証明書発行作業など,CAでの作業を行うディレクトリ.
- ~/openssl/server
- CSRの作成など,サーバ管理者の作業を行うディレクトリ.
- ~/openssl/client
- クライアント認証のための作業を行うディレクトリ.
/usr/lib/ssl/misc/CA.shというラッパーのスクリプトを使用して作成した. このスクリプトはCAの構築,証明書の発行(署名),CSRの作成を行える. 初めて
/usr/lib/ssl/misc/CA.sh -newcaを実行すると,いろいろなディレクトリが作成される.
$ tree demoCA/ demoCA/ |-- cacert.pem (CAの証明書ファイル) |-- certs(発行された証明書格納ディレクトリ) |-- crl(発行されたCRL格納ディレクトリ) |-- index.txt(データベースインデクスファイル) |-- newcerts(新規証明書の格納ディレクトリ) |-- private | `-- cakey.pem(プライベートキー) `-- serial(次に発行する証明書のシリアルナンバー記述ファイル)今回はルートCAとして作成したので,自己署名の証明書ができた.
demoCA/private/cacert.pemこのファイルをWEBブラウザなどで信頼するCAの証明書としてインポートしておく. Firefoxでは
設定->詳細->証明書マネージャ->認証局証明書(TAB)->インポートどこかの子CAとして構築するなら,CSRを作成しルートCAに証明書をもらう必要がある. また,
demoCA/private/cakey.pemは,秘密鍵なので,パーミッションを変更しておく.
$ chmod 600 demoCA/private/cakey.pem matsu@thor:~/openssl/ca$ ls -l demoCA/private/ 合計 4 -rw------- 1 matsu matsu 963 2005-07-02 21:28 cakey.pem以上でCAが構築できた.
続いて証明書を作成してみる.
まず,サーバ管理者の作業として,CSRを作成する.
上ではCN(common name)は"MATSU"などとしたが,サーバ証明書の場合,CNにはWebサーバのFQDNが入る.
ここでのCSRの作成はサーバ管理者の作業であって,CAの作業ではないので,別ディレクトリで作業した.
作成したnewreq.pemファイルにはプライベートキーとCSRが記述されているので,CAに送付する際にはCSRのみを送付する.
実際の運用ではプライベートキーは厳重に管理する.
今回は単に切り出してCA用のディレクトリに出力した.
CSRの内容を確認されたあと,さらにいろいろ出力されて,最後に証明書が記述されている.
出力ファイル./newcert.pemだが,同じ内容のファイルが
$ awk '
BEGIN{OUT=0;}
/-----BEGIN CERTIFICATE REQUEST-----/ {OUT=1;}
/./ {if (OUT==1) {print $0;}}
/-----END CERTIFICATE REQUEST-----/ {OUT=0;}
' newreq.pem > ../ca/newreq.pem
次にCAとしての作業.
作成されたCSRに対して署名する.
./demoCA/newcerts/シリアル番号.pemというファイルにも出力される. これを切り出してサーバ管理者に返す.
$ awk '
BEGIN{OUT=0;}
/-----BEGIN CERTIFICATE-----/ {OUT=1;}
/./ {if (OUT==1) {print $0;}}
/-----END CERTIFICATE-----/ {OUT=0;}
' newcert.pem > ../server/newcert.crl
切り出された証明書ファイルをWEBブラウザなどでサーバ証明書としてインポートできれば成功である.
設定->詳細->証明書マネージャ->サイト証明書(TAB)->インポートただし,今回の作成方法ではCDP(CRL Distribution Point)が記述されていないので,それがちょっと気に入らない.
続いて先程作成した証明書を失効してみる.
証明書の失効はCAにおいて証明書を対象にして実行する.
$ openssl ca -revoke demoCA/newcerts/01.pem Using configuration from /usr/lib/ssl/openssl.cnf Enter pass phrase for ./demoCA/private/cakey.pem: DEBUG[load_index]: unique_subject = "yes" Revoking Certificate 01. Data Base Updated次にCRLを生成する.
$ openssl ca -gencrl -policy policy_anything -out demoCA/crl.pemこの作業は,証明書を失効する度に実行しないとCRLに反映されない. CRLには次回CRL配布日付が記述されていて,WEBブラウザの自動更新機能などはそれにあわせて更新してくるので,運用時にはそのタイミングで上記を実行してCRLを生成しなおす. で,作成されたCRLはPEM形式のファイルである. テキストが記述されているこのファイルには,失効した証明書のシリアル番号が記述されている.
Revoked Certificates:
Serial Number: 01
Revocation Date: Jul 2 12:51:09 2005 GMT
証明書はPEM形式でもよかったが,CRLはバイナリのDER形式でないとFirefoxに怒られるようなので,変換してみる.
$ openssl crl -inform PEM -outform DER -in demoCA/crl.pem -out crl.crlあとはこれをWebブラウザなどでCRLとして読み込めれば,成功である. これは普通にURLバーにCRLファイルを指定すると読み込まれる.

