OpenSSL 資料一覧

プライベート認証局(CA)を構築して証明書の発行を行なう

2007/10/23更新

対応バージョン: 0.9.8g

証明書発行の考え方

通常、正式なサーバ証明書は日本ベリサイン等の公の認証局(以下CA)で発行してもらうが、ここではプライベートなCAを作ってサーバ証明書を発行する手順を示す。

まず、CAを構築する際に意識しなければならないことがある。

それは「自分が現在誰の立場で作業を行っているか」である。

例えばCAを構築する際にはCAが自分自身の公開鍵証明書に署名するのだが、この場合には公開鍵の持ち主と公開鍵証明書に署名するCAは同じエンティティ(認証の対象となる主体)ということになる。

従ってリクエストを作成するときや署名する際にも同じパスフレーズ(CAのパスフレーズ)を入力する。

CAの構築 → 証明書リクエスト → 証明書の発行という一連の作業を1人で行なう場合には「自分が今CAなのか、公開鍵の持ち主なのか」という立場を常に意識しておく必要がある。

一般的に「CAの鍵ペアの生成」「CAの公開鍵証明書の発行」「ユーザへの公開鍵証明書の発行」はCA管理者の立場で行ない、「ユーザの鍵ペアの生成」はユーザ自身の立場で行なうと考えればいいだろう。

しかし実際にはユーザーの鍵ペアの生成もCA管理者が代理として行なう場合もある。

CAの鍵ペアの作成

立場

CA管理者

必要なパスフレーズ

CAの秘密鍵パスフレーズ

CAの公開鍵証明書の発行

立場

CA管理者

必要なパスフレーズ

CAの秘密鍵パスフレーズ

ユーザの鍵ペアの作成

立場

ユーザ(CA管理者が代行する場合もある)

必要なパスフレーズ

ユーザの秘密鍵パスフレーズ

ユーザの公開鍵証明書の発行

立場

CA管理者

必要なパスフレーズ

CAの秘密鍵パスフレーズ

CAの構築

まずopenssl.cnfのusr_certセクションにあるnsCertTypeの値を「sslCA」に変更する。

次に実際のCAの証明書の作成であるが、OpenSSLではCAの構築と運用のためのUIとしてCA.shとCA.plというスクリプトが用意されている(/usr/local/ssl/miscに格納)。

どちらも同じUIを提供しているがここではCA.shを使うことにする。

尚、CA.shは内部でopensslコマンドを呼び出すので同コマンド格納ディレクトリ(/usr/local/ssl/bin)にパスを通しておく。

# /usr/local/ssl/misc/CA.sh -newca

CA certificate filename (or enter to create)
← CAの証明書のファイル名を入力するが、ここでは新規作成なのでリターンを押す。

Making CA certificate ...
Generating a 1024 bit RSA private key
........................................++++++
.....................................................................++++++
writing new private key to './demoCA/private/./cakey.pem'
Enter PEM pass phrase: *** ← CA秘密鍵のパスフレーズ入力
Verifying - Enter PEM pass phrase: *** ← パスフレーズ再入力
:
Country Name (2 letter code) [JP]: ← 国名(例:JP) (*) 必須
State or Province Name (full name) []: ← 都道府県名(例:Tokyo)
Locality Name (eg, city) []: ← 区市町村名(例:Chiyoda)
Organization Name (eg, company) [Private]: ← 組織名/会社名
Organizational Unit Name (eg, section) []: ← 部署名
Common Name (eg, YOUR name) []: ← 組織の通称 (例:PrivateCA) (*) 必須
Email Address []: ← メールアドレス

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ← リターン
An optional company name []: ← リターン
Using configuration from /usr/local/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/./cakey.pem: ← パスフレーズ再入力
Signature ok
Certificate Details:
:
(証明書情報)
:

これでCAを構成するファイル一式が/usr/local/ssl/demoCA配下に作成される。

尚、今回入力したパスフレーズはCAの秘密鍵のパスフレーズで、今後証明書リクエストに対して署名を行なう際に必要となる。

できあがったCAを見るといくつかのファイルとディレクトリが作成されているが、それぞれの内容は以下のとおりである。

ファイル

cacert.pem

CAの自己署名型の公開鍵証明書

同じ内容のファイルがnewcerts/00.pemとしても作成される。

careq.pem

CAが別CAから署名を受けるための要求書

private/cakey.pem

CAの公開鍵証明書(上記cacert.pem)に対応する秘密鍵

index.txt

newcertsディレクトリ内に保管される証明書の通番(nn)と識別名DN(Distinguished Name)との対応表

index.txt.attr

index.txtにて管理する通番に重複を許すかどうかの設定。

・unique_subject = yes : 重複を許さない(デフォルト)

・unique_subject = no : 重複を許す

serial

次に発行する証明書の通番(nn)

ディレクトリ

certs

証明書保管用

crl

失効リスト(Certificate Revocation List)保管用

newcerts

新規に発行した証明書保管用。証明書のファイル名は「.pem」(nnは通番)

private

CAの秘密鍵保管用

サーバ/クライアント証明書リクエストの発行

CAが正しく構築できたら次にどのような目的で証明書を発行するかによって、まずopenssl.cnfのusr_certセクションにあるnsCertTypeの値を変更する。

次に証明書リクエスト(公開鍵/秘密鍵のペア)を作成し、CAに対してその公開鍵証明書に署名してもらう。

したがってこのリクエストの発行は公開鍵の持ち主の立場で行なう。

% /usr/local/ssl/misc/CA.sh -newreq

を実行すると証明書発行のためのリクエストファイルが生成される。

この際、鍵ペアが生成されパスフレーズとDNなど公開鍵証明書に含める情報を聞かれるのでそれらを入力する。

入力が終わるとカレントディレクトリにnewreq.pem(証明書リクエスト)とnewkey.pem(秘密鍵)のペアが作成される。

newreq.pemの内容は以下のコマンドで確認することができる。

% openssl req -in newreq.pem -text 

このファイルをCAに送って認証してもらう。

CAによる署名

上記で作成した証明書に対してCAによる署名を行なう。

このときの立場は再びCA管理者の立場に戻っている。

つまり証明書リクエストを受け取ったCAがこの内容をチェックして証明書の発行を行なうという状況である。

どのディレクトリで行なうかはopenssl.cnfのCA_defaultサブセクションでdirの値をどのように設定しているかによって変わる。

先ほど作成したnewreq.pemをカレントディレクトリに置き、「CA.sh -sign」コマンドを実行するとパスフレーズを聞かれるので、CAの秘密鍵のパスフレーズを入力する。

するとリクエストファイルの内容を表示して署名をしていいかを確認してくるのでここで「y」と答えるとCAは署名を行ない公開鍵証明書を発行する。

# /usr/local/ssl/misc/CA.sh -sign
Using configuration from /usr/local/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem: *** ← CAの秘密鍵のパスフレーズ
Check that the request matches the signature
Signature ok
Certificate Details:
:
(証明書リクエストの内容)
:
Sign the certificate? [y/n]: ← y

1 out of 1 certificate requests certified, commit? [y/n] ← y
Write out database with 1 new entries
Data Base Updated
:
(署名済証明書の内容)
:

(*) 証明書の有効期間はデフォルトで1年(365日)なので、この期間を延ばしたい場合はCA.shの中で実行しているopensslコマンドを手動で実行し、-daysオプションに証明書の有効期間(日)を指定する。

# openssl ca -policy policy_anything -days 3650 -out newcert.pem -infiles newreq.pem

できあがった公開鍵証明書はnewcert.pemという名前で作成され、証明書の内容は以下のコマンドで確認することができる。

% openssl x509 -in newcert.pem -text 

また、同じ内容が./demoCA/newcerts/.pemとしても保存され、認証サマリが./demoCA/index.txtに格納される。

この証明書がサーバ証明書ならHTTPサーバに、クライアント証明書ならWebブラウザに組み込んでおけばよい。

尚、ファイル中の---BEGIN CERTIFICATE---から---END CERTIFICATE---までが実際の証明書で、その他は人間が読むためのものなので証明書の部分だけ切り分けてcert.pem等として保存しておいてもよい。