OpenSSLで雑にCAを構築する

CA.shやopenssl.cnfに触らずにCA証明書を作って署名する方法のメモ。 なお、きちんとした運用が必要な場面では参考にすべきでない。

話を単純にするため、以下で用いる公開鍵アルゴリズムはすべてRSA 2048 bitとする。

CA証明書の作成

自己署名証明書を作ると自動的にBasic ConstraintsにCA:TRUEが付くため、そのままCA証明書(より正確にはルート証明書)となる。

$ openssl genrsa -out ca.key 2048
$ openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=my private CA"

ここでは、ca.keyがCAの秘密鍵、ca.crtがCA証明書となる。 また、-daysオプションを使って有効期限を約10年後に指定している。 指定しない場合はデフォルトのopenssl.cnfのdefault_daysに書かれている日数が使われる。 さらに、-subjオプションを使うことで対話的な入力を行うことなくSubjectを指定することができる。

鍵にパスフレーズをかけることを強制されてもよいなら、次のようにして鍵とCA証明書を一度に生成することもできる。

$ openssl req -new -x509 -days 3650 -newkey rsa:2048 -keyout ca.key -out ca.crt -subj "/CN=my private CA"

CA署名付き証明書の作成

秘密鍵CSR(証明書署名要求)、署名付き証明書の順で作成する。

$ openssl genrsa -out cert.key 2048
$ openssl req -new -key cert.key -out cert.csr -subj "/CN=www.example.com"
$ openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key -CAcreateserial -in cert.csr -out cert.crt

cert.keyが秘密鍵、cert.csrCSR、cert.crtが署名付き証明書である。 cert.crtを作成した後は、cert.csrは削除してよい。

ここでも、-daysオプションを使って署名付き証明書の有効期限を約10年後に指定している。 また、-CAcreateserialオプションによりシリアル番号を自動的に生成する。 この際、発行済みシリアル番号を保持するファイルca.srlが作成される。

-CAcreateserialオプションの代わりに-set_serialオプションを使えば、任意のシリアル番号を指定することができる。 この場合、ca.srlは作成されない。

$ openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key -set_serial 1 -in cert.csr -out cert.crt

シリアル番号は個々のCAにおいて、署名済み証明書ごとに異なる番号でなければならないことに注意。

証明書の内容を確認する

CA証明書、CA署名付き証明書どちらについても、同じように内容を確認できる。

$ openssl x509 -in ca.crt -noout -text
$ openssl x509 -in cert.crt -noout -text

関連リンク