Vault で中間 CA 証明書を使って証明書を発行する
ルート CA 証明書の秘密鍵をオフラインで管理しつつ Vault で証明書を発行したかったので、中間 CA 証明書を使う方法を調べた。今回はルート CA 証明書は CFSSL を使って管理する。
最初に CFSSL の設定ファイルを生成して、ルート CA 証明書と中間 CA 証明書の発行に使用するプロファイルを用意しておく。とりあえずルート CA 証明書の有効期限は10年、中間 CA 証明書の有効期限は5年とした。
$ cfssl print-defaults config > config.json
$ vim config.json
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"root": {
"expiry": "87600h",
"usages": [
"cert sign",
"crl sign"
],
"ca_constraint": {
"is_ca": true,
"max_path_len": 1,
"max_path_len_zero": false
}
},
"intermediate": {
"expiry": "43800h",
"usages": [
"cert sign",
"crl sign"
],
"ca_constraint": {
"is_ca": true,
"max_path_len": 0,
"max_path_len_zero": true
}
}
}
}
}
次にルート CA 証明書を発行に使用する CSR 設定ファイルを生成して、証明書の情報を入力しておく。
$ cfssl print-defaults csr > root-csr.json
$ vim root-csr.json
{
"CN": "SummerWind Root CA",
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "JP",
"L": "Tokyo",
"O": "SummerWind"
}
]
}
生成した CSR 設定ファイルを使用して、ルート CA 証明書を生成する。
$ cfssl gencert --config config.json --profile root -initca root-csr.json | cfssljson -bare root
2018/08/09 22:50:21 [INFO] generating a new CA key and certificate from CSR
2018/08/09 22:50:21 [INFO] generate received request
2018/08/09 22:50:21 [INFO] received CSR
2018/08/09 22:50:21 [INFO] generating key: ecdsa-256
2018/08/09 22:50:21 [INFO] encoded CSR
2018/08/09 22:50:21 [INFO] signed certificate with serial number 228110009831377793192232349411731324446220331642
続いて、事前に起動しておいた Vault の PKI Secret Engine を有効化して、証明書の有効期限にあわせて Max Lease TTL を変更しておく (以下の場合は最大5年)。
$ vault secrets enable pki
$ vault secrets tune -max-lease-ttl=43800h pki
Vault の PKI Secret Engine から中間 CA 証明書の CSR を生成する。
$ vault write -field csr pki/intermediate/generate/internal common_name="SummerWind Intermediate CA" ttl=43800h > intermediate.csr
CFSSL でルート CA 証明書を使用して、CSR から中間 CA 証明書を発行する。
$ cfssl sign -config config.json -profile intermediate -ca root.pem -ca-key root-key.pem intermediate.csr | cfssljson -bare intermediate
2018/08/09 22:58:23 [INFO] signed certificate with serial number 665781423745212565815810381896532825194216477215
中間 CA 証明書とルート CA 証明書を結合してから、Vault に登録する。
$ cat intermediate.pem root.pem > bundle.pem
$ vault write pki/intermediate/set-signed [email protected]
外部に中間 CA 証明書や CRL を公開する場合は以下のように Vault を設定しておく。
$ vault write pki/config/urls issuing_certificates="https://${VAULT_ADDR}/v1/pki/ca" crl_distribution_points="https://${VAULT_ADDR}/v1/pki/crl"
中間 CA 証明書から証明書を発行できるように PKI Secret Engine のロールを登録する。以下は summerwind.jp
ドメインの証明書を発行可能にしている。
$ vault write pki/roles/summerwind allowed_domains=summerwind.jp allow_subdomains=true max_ttl=8760h
最後に中間 CA 証明書から証明書を発行する。
$ vault write pki/issue/summerwind common_name=summerwind.jp key_type=ec -format=json > cert.json
$ cat cert.json | jq -r .data.certificate > server.pem
$ cat cert.json | jq -r .data.private_key > server-key.pem
これでルート CA 証明書の秘密鍵はオフラインで管理しつつ、Vault からは証明書を動的に発行できる。便利。