Shammer's Philosophy

My private adversaria

独自のCA環境を構築する - 自己署名証明書作成編

「OpenSSL設定ファイル編」では、ディレクトリ構成や証明書のpolicyについて定義を行ったが、
実際に証明書を作成するにはもう少し定義が必要。先のopenssl.confにもう少し情報を追加する。

[ca]
default_ca = MyOwnRootCA
[MyOwnRootCA]
dir = /MyOwnRootCA
certifcate = $dir/cacert.pem
database = $dir/index.txt
new_certs_dir = $dir/certs
private_key = $dir/private/cakey.pem
serial = $dir/serial
default_crl_days = 7
default_days = 365
default_md = md5
policy = MyOwnRootCA_policy
x509_extensions = certificate_extensions
[MyOwnRootCA_policy]
countryName = supplied
stateOrProvinceName = supplied
organizationName = supplied
organizationUnitName = optional
commonName = supplied
emailAddress = supplied
[certificate_extensions]
basicConstraints = CA:false
[req]
default_bits = 2048
default_keyfile = /MyOwnRootCA/private/cakey.pem
default_md = md5
prompt = no
distinguished_name = root_ca_distinguished_name
x509_extensions = root_ca_extensions
[root_ca_distinguished_name]
commonName = MyOwnRootCA
stateOrProvinceName = Tokyo
countryName = JP
emailAddress = hogehoge.fugafuga@email.com
organizationName = My Own Root Certification Authority
[root_ca_extensions]
basicConstraints = CA:true

追加したのは、[req]と[root_ca_distingished_name]と[root_ca_extensions]というブロック。
それぞれ次のような意味がある。

[req]
openssl req コマンドの際に参照される情報
default_bits
証明書用の秘密鍵のビット数
default_keyfile
生成された秘密鍵を出力する場所
default_md
鍵の署名に使用するメッセージダイジェストアルゴリズム
prompt
鍵を生成する際の個人情報(組織とか名前とかpolicyで定義された情報)を対話式に入力するかを決める。noの場合は、distinguished_nameブロックからこの情報を取得する。
distinguished_name
promptがnoの場合にpolicy情報を定義しておくブロック。この名前のブロックからpolicy情報を読み込む。
x509_extensions
証明書に含めたい拡張領域が定義されたブロックを指定する。

openssl.confを上記のように書き換えて、

openssl req -x509 -newkey rsa -out cacert.pem -outform PEM
としてやれば、秘密鍵を暗号化するためのパスフレーズを入力するよう求められる。
そして、そのパスフレーズを入力すれば、openssl.confから情報を読み込みつつ、
自己署名証明書が作成される。作成された証明書(上記コマンドだとcacert.pem)をテキストエディタで開くと、
-----BEGIN CERTIFICATE-----
略
-----END CERTIFICATE-----
という形式になっているはず。これで自己署名証明書は完成。