SummerWind

Web, Photography, Space Development

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 certificate=@bundle.pem

外部に中間 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 からは証明書を動的に発行できる。便利。

Moto Ishizawa

Moto Ishizawa
ソフトウェアエンジニア。ロケットの打上げを見学するために、たびたびフロリダや種子島にでかけるなど、宇宙開発分野のファンでもある。