ファイヤープロジェクト
CAの構築
2005-07-03T00:40+09:00   matsu
OpenSSLを使用してCAを構築してみた.
本頁では,OpenSSLを使用してCAを構築してみる. より具体的には,以下のような作業をする.
  • OpenSSLを使用した証明書発行環境を構築する(CAの構築).
  • CSRを作成する.
  • 構築したCAにて証明書を発行する.
  • 構築したCAにて発行したCRLを失効する.
  • CRLを作成する.
すなわち証明書の発行に関する基本的な作業をやってみる.
まず,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
クライアント認証のための作業を行うディレクトリ.
続いてOpenSSLを使用してCAを構築してみる.
OpenSSLのコマンドはopensslだが,いろいろと難しいので,
/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用のディレクトリに出力した.
$ 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に対して署名する.
CSRの内容を確認されたあと,さらにいろいろ出力されて,最後に証明書が記述されている. 出力ファイル./newcert.pemだが,同じ内容のファイルが
./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ファイルを指定すると読み込まれる.
matsu(C)
Since 2002
Mail to matsu