★ OpenSSL Class ★ * Chapter 02: 認証局の作成 *
< 認証局(CA)とは >
認証局とは、サーバー証明書等に対して第三者として署名をする機関(?)です。
自分で「 私は信用に足る人物です 」と言っても信用してもらえませんので、
第三者に「 この人は信用に足る人物です 」と言ってもらうわけです。

今度はその第三者が信用に足る人物でなくてはなりません。
その信用に足る人物にあたるのが、Chapter00で紹介した認証局なのです。

今回は認証局を作成しますが、いきなり作った認証局に社会的信用があるわけありませんので、
自分の練習用の認証局ということになります。

そんなちょこっと署名するだけで何万も取れるなら自分で認証局を立ち上げたいという起業家精神に富んだ方もおられるかと思いますが、
認証局の開局には非常に面倒な要件や手続きがありますので、恐らく挫折すると思います。

ちなみに、認証局はしばしば『 CA 』と呼ばれます。
< 鍵の作成 >
鍵及び証明書を作成するにあたって、作業用のディレクトリを作成しておくと混乱がないと思います。
CAの鍵及び証明書を作成するために、この解説では『 /home/.ca 』を使用することにします。

作業用のディレクトリを作成したらそのディレクトリの中に入って早速鍵を作成してみます。
今回作成するのは『 秘密鍵 』です。
秘密鍵の作成は以下のコマンドによって実現できます。

openssl genrsa -rand [RANDOM FILE] -out [CA KEY] [NUMBITS]

[RANDOM FILE] には乱数生成に使用するファイルを指定します。
なるべく変化が激しく、再現性のないファイルが望ましいです。
各種ログファイルなんかが適当だと思います。

[CA KEY] には作成するCA秘密鍵のファイル名を指定します。
何でも良いですが、本講座では『 ca.key 』とします。

[NUMBITS] には鍵のビット数を指定します。
『 1024 』が無難です。

コマンドを実行すると、すぐに『 ca.key 』が作成されます。
この『 ca.key 』は作成の簡単さに反して非常に重要な鍵ファイルですので、バックアップを取る等して厳重に保管してください。
これから証明書や、サーバーの鍵等色々作成していきますが、このファイルがベースになっています。
この鍵をなくしたり、他者に見られるなどすると、その鍵によって保障されている全ての鍵や証明書の信頼がなくなります。
< 署名要求の作成 >
次にCAの署名要求を作成します。
署名要求はしばしば『 CSR 』と呼ばれます。
署名要求の作成は以下のコマンドによって実現できます。

openssl req -new -key [CA KEY] -out [CA CSR]

[CA KEY] には先程作成したca.keyを指定します。

[CA CSR] には作成する書名要求ファイルの名前を指定します。
署名要求のファイル名は何でも良いですが、本講座では『 ca.csr 』とします。
このコマンドを実行するといくつか質問されますので、順に答えていきます。

Country Name (2 letter code) [GB]:

これには国コードを2文字で指定します。
日本の場合は『 JP 』です。

State or Province Name (full name) [Berkshire]:

州や県をローマ字で書きます。
『 Kyoto 』『 Tokyo 』『 Kanagawa 』等です。
『 県府都道 』は必要ありません。

Locality Name (eg, city) [Newbury]:

具体的な住所をローマ字で書きます。
市町村区までで良いようです。

Organization Name (eg, company) [My Company Ltd]:

自分の所属している組織名をローマ字で記述します。
会社に所属している場合は会社名になります。

Organizational Unit Name (eg, section) []:

その組織の中で自分の所属している部署の名前をローマ字で記述します。

Common Name (eg, your name or your server's hostname) []:

サーバーのホスト名を記述します。
自分の名前やドメイン名でも良いようですが知りません。

Email Address []:

自分のメールアドレスを記述します。

A challenge password []:

この証明書に対してパスワードを設定します。
設定しないことも可能です。
パスワードを設定すると、この署名要求を使って何かしようとしたときに度々パスワードを聞かれます。

An optional company name []:

よく分かりませんが空欄で良いようです。

具体的な内容を示しておきます。

Explain
< 署名要求へ署名 >
署名要求に対して、実際に署名をします。

openssl x509 -req -days [LIMIT] -in [CA CSR] -signkey [CA KEY] -out [CA CRT]

[LIMIT] 作成する証明書の有効期限を日数で指定します。

[CA CSR] には先程作成したca.csrを指定します。

[CA KEY] には先程作成したca.keyを指定します。

[CA CRT] には作成する証明書のファイル名を指定します。
何でも良いですが、本講座では『 ca.crt 』とします。

コマンドを実行すると、『 ca.crt 』が作成されます。
これがCAの証明書となり、この証明書をブラウザにインポートすることによって、このCAによって署名されたSSL証明書を信頼することができるようになります。
< シリアルナンバーの作成 >
最後にシリアルナンバーを作成しておきます。
シリアルナンバーはサーバーの署名要求に署名する度にカウントされます。
シリアルナンバーはテキストファイルの形で作成します。

シリアルナンバーを書いたファイルは『 ca.srl 』とし、署名作業をするディレクトリ内に配置します。
最初は『 01 』とだけ記述しておきます。
< まとめ >
以下の流れを覚えてください。
これはCA証明書の作成時も、サーバー証明書の作成時も同じです。

   秘密鍵を作成する
    ↓
   署名要求を作成する
    ↓
   署名する

さて次章ではサーバー証明書を作成してみます。
執筆: 2008/10/14 (TUE)