OpenSSL:ルートCAの作成
ルートCA用のディレクトリにて
ca コマンドの利用を見越した設定
$ mkdir -p /opt/pki/rootca
$ cd /opt/pki/rootca
$ mkdir -m 700 private
$ mkdir certs crl newcerts
$ vi openssl.cnf
openssl.cnf
code:openssl.cnf
default_ca = CA_default
dir = /opt/pki/rootca
certificate = $dir/cacert.pem
private_key = $dir/private/cakey.pem
certs = $dir/certs
database = $dir/index.txt
new_certs_dir = $dir/newcerts
serial = $dir/serial
default_days = 365
default_md = sha256
email_in_dn = no
policy = policy_match
x509_extensions = x509_ext
copy_extensions = copy
;rand_serial = yes
countryName = match
stateOrProvinceName = match
localityName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
authorityKeyIdentifier = keyid,issuer
subjectKeyIdentifier = hash
distinguished_name = req_dn
prompt = no
req_extensions = req_ext
0.countryName = JP
0.stateOrProvinceName = Tokyo
0.localityName = Chiyoda-ku
0.organizationName = OreOre Corp.
0.commonName = OreOre RootCA
basicConstraints = critical,CA:TRUE,pathlen:2
keyUsage = critical,keyCertSign,cRLSign
serial
rand_serial を指定しない限りは必要。
シリアルファイルのパスが必要。先にファイルを作っておく必要がある。少なくとも2桁の数値が必要。1桁だとエラー(なぜ?)
default_md
書かないと怒られる。
sha256 でよい。
policy_match
policy_match に書いていない項目は削られてしまう模様。
match にすると、CA の証明書の内容と CSR の内容とが一致していなければ署名できない。
supplied にすると、CSR に書いていないと署名できない。
optional にすると、CSR に書いていなくても構わない。
copy_extensions
copy とすると、CA側の設定が強い。
copyall とすると、証明書要求側の設定が強い(上書きされる)。(推奨されない)
subjectKeyIdentifier
証明書の識別を、ハッシュ方式(default_md が示す sha256)で。
authorityKeyIdentifier
署名者の識別を、キーID(ハッシュ)と発行者(DNとシリアル)で表示。
ルートCAの authorityKeyIdentifier はなくてもよいが念のため付けておく。(中間CA用と同じ設定)
rand_serial は値は無視されるらしい。rand_serial = no と書いてもシリアルがランダム番号になった。
basicConstraint
CA:TRUE で CA であることを宣言。
pathlen:2 で、ルートCAと中間CAの2つまでであることを宣言。
critical はそれ以外をしようとするとエラーという意味。
keyUsage
CA は証明書に対する署名(keyCertSign)とCRLに対する署名(cRLSign)のみをする。
critical はそれ以外をしようとするとエラーという意味。
$ touch index.txt
serial は次に発行する証明書のシリアル番号(00 からでも悪くないが)
$ echo 01 >serial
秘密鍵の作成
$ openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp384r1 -aes128 -out private/cakey.pem
自動化したいなら -aes128 を外す。
秘密鍵の確認
$ openssl pkey -in private/cakey.pem -text -noout
証明書要求の作成
$ openssl req -new -config ./openssl.cnf -key private/cakey.pem -out cacsr.pem
証明書要求の確認
$ openssl req -in cacsr.pem -noout -text
x509 コマンドの -startdate, -enddate オプションは表示の時のみ意味がある。設定はできない。
このため、-startdate, -enddate を指定したいならば ca コマンドを使うしかない。
証明書要求に対して署名する
$ openssl ca -config ./openssl.cnf -startdate 20240101000000Z -enddate 20331231235959Z -selfsign -in cacsr.pem -out cacert.pem
証明書の確認
$ openssl x509 -in cacert.pem -text -noout