[アップデート] AWS Private CA のプライベート CA に短期間の証明書のみを発行できるお求めやすい価格のモードが登場しました

お求めやすい価格になったプライベート CA、みなさまのご家庭に 1 台いかがでしょうか。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンバンハ、千葉(幸)です。

AWS Private Certificate Authority のプライベート CA に短期間証明書モード(short-lived certificate mode)が追加されました。

従来のプライベート CA は汎用モード(general purpose mode)という考え方となり、引き続きデフォルトのモードとなります。

短期間証明書モードで発行できる証明書の有効期限は最大で7日となっており、ユースケースとしては限定的となりそうです。

まとめ

  • AWS マネジメントコンソールからプライベート CA を作成した際はデフォルトの汎用モードになる
  • 短期間証明書モードで発行できる証明書の有効期限は最長で 7日間
    • 失効メカニズムは指定できない
    • ACM で自動更新することはできない
  • 汎用モードと比較して短期間証明書モードの方がコストが安い

AWS Private CA にかかる料金

AWS Private CA では以下観点で料金が発生します。

  • プライベート CAにかかる料金
  • プライベート証明書の発行枚数に応じた料金
  • Online Certificate Status Protocol (OCSP)に応じた料金

短期間証明書モードでは前者2つの料金が汎用モードと比べて安くなっています。 *2

AWS Private CA のプライベート CA といえば「ただそこにあるだけで月に 400 ドル」というインパクトのあるものでしたが、短期間証明書モードでは少しおとなしめの料金になりました。

最新の料金情報は以下を参照してください。

証明書の有効期限

上記のイメージでは、それぞれのモードで発行された証明書の有効期限について以下のように表現しました。

  • 汎用モード:実質無期限
  • 短期間証明書モード:7 日間

短期間証明書モードが 7 日間というのはドキュメントの記載から自明ですが、汎用モードではどのように考えたらいいのか?以下のページを参考にしました。

(上記のページより画像引用)

証明書の有効期限は親となる証明書より短いものである必要があります。

  • ルート CA 証明書(最上位)
  • 下位 CA 証明書(無い場合や複数のツリー構造になっている場合もある)
  • エンドエンティティ証明書

「汎用モードでは実質無期限、短期間証明書モードでは最長で 7 日間」と言っているのはエンドエンティティ証明書です。

エンドエンティティ証明書は発行 CA の有効期限より短い限り任意の有効期間を設定できる、とあります。

AWS Private CA では、IssueCertificate API を使用して、発行元 CA の有効期間を下回っている限り、任意の有効期間を適用できます。

そして CA の証明書の発行を行う API を確認すると、RFC 5280 に則っていれば任意の期間を指定できると書いてありそうです。

RFC 5280 では特に期限に関する記述は見つけられなかったので、トータルで考えて「実質無期限」としています。

CAs conforming to this profile MUST always encode certificate
validity dates through the year 2049 as UTCTime; certificate validity
dates in 2050 or later MUST be encoded as GeneralizedTime.
Conforming applications MUST be able to process validity dates that
are encoded in either UTCTime or GeneralizedTime.

プライベート CA 作成してみた

せっかくの機会だから触ってみるか、ということでプライベート CA を作成してみます。

マネジメントコンソール、AWS CLI 両方のパターンで試します。前者は(少なくとも 2022年11月現在は)強制的に汎用モードになります。

マネジメントコンソールからCAを作成(汎用モード)

AWS Private CA のコンソールより、「プライベート CA を作成」を押下します。

AWS_Private_CA_Console_private_ca

いくつかパラメータが指定できますが、最小限の内容を入力して「CA を作成」を押下します。

赤枠で囲ってある部分以外はデフォルトに従っています。

↑ここでモードの選択ができたりはしないことが分かります。

ひとまずプライベート CA が作成されました。この時点では保留中 *3であるため、「アクション」→「CA 証明書をインストール」を押下します。

AWS_Private_CA_Console_private_ca-7498120

ルート CA 証明書をインストールします。デフォルトでは 10 年が設定されているのでそのまま「確認してインストール」を押下します。

AWS_Private_CA_Console_install_cert

アクティブなステータスになりました。ちなみにいまインストールした CA 証明書をコンソールから取得することもできます。

AWS_Private_CA_Console_installed_ca

作成したプライベート CA のモードを確認する

マネジメントコンソールではモードの確認ができないため、AWS CLI で確認します。

以降の操作は現時点で最新であろう AWS CLI v2 のバージョンを用いています。

% aws --version
aws-cli/2.8.8 Python/3.9.11 Darwin/21.3.0 exe/x86_64 prompt/off

以下コマンドを実行すると、"UsageMode": "GENERAL_PURPOSE"となっていることが分かります。

% aws acm-pca describe-certificate-authority\
  --certificate-authority-arn arn:aws:acm-pca:ap-northeast-1:012345678910:certificate-authority/3dbd3f12-02c0-406c-b62f-909fc05ef0b2
{
    "CertificateAuthority": {
        "Arn": "arn:aws:acm-pca:ap-northeast-1:012345678910:certificate-authority/3dbd3f12-02c0-406c-b62f-909fc05ef0b2",
        "OwnerAccount": "012345678910",
        "CreatedAt": "2022-11-04T02:53:52.247000+09:00",
        "LastStateChangeAt": "2022-11-04T02:56:32.947000+09:00",
        "Type": "ROOT",
        "Serial": "3552621765890690898876837113989432947",
        "Status": "ACTIVE",
        "NotBefore": "2022-11-04T01:56:28+09:00",
        "NotAfter": "2032-11-04T02:55:25+09:00",
        "CertificateAuthorityConfiguration": {
            "KeyAlgorithm": "RSA_2048",
            "SigningAlgorithm": "SHA256WITHRSA",
            "Subject": {
                "Country": "JP",
                "Organization": "example"
            }
        },
        "RevocationConfiguration": {
            "CrlConfiguration": {
                "Enabled": false
            },
            "OcspConfiguration": {
                "Enabled": false
            }
        },
        "KeyStorageSecurityStandard": "FIPS_140_2_LEVEL_3_OR_HIGHER",
        "UsageMode": "GENERAL_PURPOSE"
    }
}

AWS CLI でプライベート CA を作成(短期間証明書モード)

マネジメントコンソールからは短期間証明書モードが作成できないため、以下ページを参考に AWS CLI で作成していきます。

ドキュメントではコンフィグをあらかじめファイルに保存しておく方式が取られていますが、横着して変数を利用します。

# コマンド実行のコンフィグを変数に格納
% config=$(cat <<EOM
{
    "KeyAlgorithm":"RSA_2048",
    "SigningAlgorithm":"SHA256WITHRSA",
    "Subject":{
       "Country":"US",
       "Organization":"Example Corp",
       "OrganizationalUnit":"Sales",
       "State":"WA",
       "Locality":"Seattle",
       "CommonName":"www.example.com"
    }
 }
EOM
)

# 上記の変数を指定してコマンド実行
% aws acm-pca create-certificate-authority \
             --certificate-authority-configuration "$config" \
             --certificate-authority-type "ROOT" \
             --usage-mode SHORT_LIVED_CERTIFICATE \
             --tags  Key=usageMode,Value=SHORT_LIVED_CERTIFICATE
{
    "CertificateAuthorityArn": "arn:aws:acm-pca:ap-northeast-1:012345678910:certificate-authority/ceb4bf59-d90f-48af-9b68-74b2927f3325"
}

作成されたプライベート CA の設定を確認します。"UsageMode": "SHORT_LIVED_CERTIFICATE"となっていることが分かります。

% aws acm-pca describe-certificate-authority\
    --certificate-authority-arn arn:aws:acm-pca:ap-northeast-1:012345678910:certificate-authority/ceb4bf59-d90f-48af-9b68-74b2927f3325
{
    "CertificateAuthority": {
        "Arn": "arn:aws:acm-pca:ap-northeast-1:012345678910:certificate-authority/ceb4bf59-d90f-48af-9b68-74b2927f3325",
        "OwnerAccount": "012345678910",
        "CreatedAt": "2022-11-04T21:36:51.631000+09:00",
        "LastStateChangeAt": "2022-11-04T21:36:52.762000+09:00",
        "Type": "ROOT",
        "Status": "PENDING_CERTIFICATE",
        "CertificateAuthorityConfiguration": {
            "KeyAlgorithm": "RSA_2048",
            "SigningAlgorithm": "SHA256WITHRSA",
            "Subject": {
                "Country": "US",
                "Organization": "Example Corp",
                "OrganizationalUnit": "Sales",
                "State": "WA",
                "CommonName": "www.example.com",
                "Locality": "Seattle"
            }
        },
        "RevocationConfiguration": {
            "CrlConfiguration": {
                "Enabled": false
            },
            "OcspConfiguration": {
                "Enabled": false
            }
        },
        "KeyStorageSecurityStandard": "FIPS_140_2_LEVEL_3_OR_HIGHER",
        "UsageMode": "SHORT_LIVED_CERTIFICATE"
    }
}

後続の手順も AWS CLI で続けようと思えば続けられますが、しんどくなってきたのでマネジメントコンソールに移ります。コンソールから作成した時と同じように保留中になっています。

AWS_Private_CA_Console_shrot_lived_mode

ルート CA 証明書をインストールします。(実際に試すまで「ここでの有効期限を最大 7 日間しか指定できないのか?」と考えていたのですが、そうではありません。7 日間なのはエンドエンティティ証明書の有効期限です。)

AWS_Private_CA_Console_root_cert_install

アクティブな状態になりました。

AWS_Private_CA_Console_active_cert

エンドエンティティ証明書を発行してみた

以下の手順を参考に、短期間証明書モードのプライベート CA から証明書を発行します。

手元の端末で openssl コマンドを使用し証明書の CSR とプライベートキーを生成します。

% openssl req -out csr.pem -new -newkey rsa:2048 -nodes -keyout private-key.pem
Generating a 2048 bit RSA private key
.......................................................+++
......+++
writing new private key to 'private-key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:JP # 何も入力しないわけにはいかないのでここだけ入力した
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:

CSR の内容は以下のようになっています。

% openssl req -in csr.pem -text -noout
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=JP
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:a7:55:3f:34:84:58:44:31:34:0b:b6:28:05:6a:
                    8a:6b:19:40:92:51:a1:51:5b:32:f5:cc:8e:ed:53:
                    25:25:30:ab:0d:95:38:83:2f:e5:fe:1b:c1:41:95:
                    41:bf:1b:aa:d1:ad:e6:f5:53:75:93:a1:58:a2:f7:
                    bf:b9:64:e8:3f:c6:e9:e9:70:bd:2d:44:a9:c0:1b:
                    e5:52:e7:1c:0e:8b:36:7a:b1:77:28:2a:30:a9:0e:
                    d3:5d:45:ce:f5:d3:09:e3:de:4c:48:f1:8e:3f:14:
                    00:e9:ae:11:67:7f:9c:01:b5:ea:03:a6:84:b1:64:
                    0b:2c:e8:8d:73:d4:ff:cd:58:5d:64:25:d3:df:29:
                    79:48:b2:46:74:64:a4:d7:ef:53:e3:ea:d4:b9:e6:
                    ca:6f:8b:ab:21:66:12:a0:23:6d:c8:5f:67:ef:1d:
                    1b:a5:bf:c9:f7:4b:ee:23:7a:45:5d:13:90:9f:b7:
                    69:fa:72:dd:e8:fb:ed:51:cc:3b:ec:d7:3c:94:12:
                    e9:f0:47:71:7a:22:70:45:f0:c1:b2:75:d6:49:74:
                    2f:2e:d9:6d:2d:07:d8:97:e2:a0:79:a2:bc:b8:ea:
                    72:e7:a2:3c:7a:76:56:1a:90:01:b2:b2:54:6f:39:
                    d1:57:eb:dd:c8:56:d9:14:4c:d7:12:93:29:2c:cd:
                    a8:4d
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         3c:d1:4d:6a:a6:9f:d6:ab:65:c3:23:ea:99:3b:33:f6:ba:24:
         dc:79:a5:65:48:a4:08:10:b0:64:f2:b9:99:23:e7:3c:85:7c:
         38:a3:4f:5f:dd:7f:46:d6:36:97:ad:db:79:e1:97:4c:e7:36:
         69:26:86:2f:d5:30:ae:7c:f9:f7:cd:47:cf:f7:16:94:e7:60:
         e4:a4:58:de:0c:0b:1f:1a:bf:21:55:97:5a:54:87:6b:01:9f:
         14:66:7b:2e:8a:67:89:e9:4f:da:8e:66:66:29:ea:8c:f3:54:
         49:ea:0f:34:1a:a8:a0:2e:44:56:b6:69:03:af:57:cd:7c:b7:
         87:40:53:0d:a9:f8:bf:e0:3a:f2:5e:6a:10:1d:00:9b:54:48:
         fa:ef:80:65:1f:9e:21:fd:d3:21:4d:98:85:0d:2d:71:da:30:
         6a:45:c5:78:49:50:53:99:9f:d9:98:36:d1:5c:22:20:14:47:
         44:d1:0b:f8:f9:27:5e:a6:cd:6a:29:21:70:57:67:d3:cc:28:
         e4:fe:30:d0:97:df:92:14:32:6a:6c:d9:2c:39:3b:b1:c0:d4:
         b0:c1:f0:ff:25:a3:dd:94:be:a0:31:dd:55:b4:7f:7c:78:c0:
         a2:df:c9:9d:55:37:1c:8c:34:f6:3f:cc:52:53:3a:61:f7:61:
         e3:a8:55:49

aws acm-pca issue-certificateコマンドで証明書の発行を試みますが、ドキュメントの例のまま有効期限を 365 日で指定するとエラーが発生しました。

% aws acm-pca issue-certificate \
      --certificate-authority-arn arn:aws:acm-pca:ap-northeast-1:012345678910:certificate-authority/ceb4bf59-d90f-48af-9b68-74b2927f3325 \
      --csr fileb://csr.pem \
      --signing-algorithm "SHA256WITHRSA" \
      --validity Value=365,Type="DAYS"

An error occurred (ValidationException) when calling the IssueCertificate operation: The requested certificate validity exceeds the maximum allowed by the usage mode. Reduce the requested validity period to be equal to or less than that supported by the usage mode for this CA or use a CA with a different usage mode.

7 日間という数字は出てきませんが、現在の短期間証明書モードで許可されている有効期限を超えている、という内容が読み取れます。

The requested certificate validity exceeds the maximum allowed by the usage mode. Reduce the requested validity period to be equal to or less than that supported by the usage mode for this CA or use a CA with a different usage mode.

期限を 7 日間に指定して実行し直すと、コマンドが成功し証明書の ARN が返却されます。

% aws acm-pca issue-certificate \
      --certificate-authority-arn arn:aws:acm-pca:ap-northeast-1:012345678910:certificate-authority/ceb4bf59-d90f-48af-9b68-74b2927f3325 \
      --csr fileb://csr.pem \
      --signing-algorithm "SHA256WITHRSA" \
      --validity Value=7,Type="DAYS"
{
    "CertificateArn": "arn:aws:acm-pca:ap-northeast-1:012345678910:certificate-authority/ceb4bf59-d90f-48af-9b68-74b2927f3325/certificate/157fc149bee8ce682eb3f0948c423ef0"
}

証明書の内容はaws acm-pca get-certificateコマンドで確認できます。

証明書と証明書チェーンが出力されています。

% aws acm-pca get-certificate \
      --certificate-arn arn:aws:acm-pca:ap-northeast-1:012345678910:certificate-authority/ceb4bf59-d90f-48af-9b68-74b2927f3325/certificate/157fc149bee8ce682eb3f0948c423ef0 \
      --certificate-authority-arn arn:aws:acm-pca:ap-northeast-1:012345678910:certificate-authority/ceb4bf59-d90f-48af-9b68-74b2927f3325 | \
      jq -r '.Certificate, .CertificateChain'
-----BEGIN CERTIFICATE----- # 証明書
MIIDgDCCAmigAwIBAgIQFX/BSb7ozmgus/CUjEI+8DANBgkqhkiG9w0BAQsFADBt
MQswCQYDVQQGEwJVUzEVMBMGA1UECgwMRXhhbXBsZSBDb3JwMQ4wDAYDVQQLDAVT
YWxlczELMAkGA1UECAwCV0ExGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTEQMA4G

……略……

dASRPlDmCNZvkDBrf498vIfEXbx8Dvg7q/uIOkUiZ+BnwZ+1blTnJIlrb/0kaVGF
92hRkxmeK+ObvYbQF+t8gjGSZftoCgY4cK93xbK5LuQFQ6ZW3F6GBprZ512r4FTW
QmhlZYgD0aJ3vD+Ev+p+OFXiQrctvTEjhXQs89qnTv+4946R
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE----- # 証明書チェーン
MIIDpjCCAo6gAwIBAgIQN0oCG4S/0sq3yMCR45VFfDANBgkqhkiG9w0BAQsFADBt
MQswCQYDVQQGEwJVUzEVMBMGA1UECgwMRXhhbXBsZSBDb3JwMQ4wDAYDVQQLDAVT
YWxlczELMAkGA1UECAwCV0ExGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTEQMA4G

……略……

5COcR2AYkBrmXK7h2LNXLphmcoOyyvT6fnSzLneQ6p+UYG+be7x5xDv6u1EnEu93
/nutWrDW9FCF2+TTVqa+PMO/0K1LG//DeYVZ5wwxA3400JFJN+meW9MeZpOYzf6N
Rd4ZWcu4/XnEuNqIbdSwsg/RPn5A9L8WiaY=
-----END CERTIFICATE-----

発行したエンドエンティティ証明書を ACM へインポートしてみる

せっかくなので ACM にインポートしてみます。

ステップ 1 で、それぞれの内容を入力します。

AWS_Certificate_Manager_inport_private

ステップ2(タグの付与)、ステップ3(確認)と進むことでインポートが完了します。

インポートされた内容を見ると、指定した通り有効期限が 7 日間であることが分かります。(発行からインポートまでの間に 10 分間ほどかかっています。)

AWS_Certificate_Manager_private_CA

短期間証明書モードのプライベート CA からの証明書の発行が確認できました。

終わりに

AWS Private Certificate Authority のプライベート CA に新たなモードが追加された、というアップデートでした。

プライベート CA と言えば「高い」「怖くて触れない」という印象を持っていましたが、お求めやすい価格のモードが登場して少し心理的ハードルが下がりました。

そもそもプライベート CA を使用する機会が少ない(個人の感想です)上に有効期限が最長 7 日間となると使い所は限定されそうですが、選択肢として何があるかを押さえておいて損はないでしょう。

ぜひ何かの機会に思い出してください。

以上、 チバユキ (@batchicchi) がお送りしました。

参考

脚注

  1. 説明がこれで合っているのか自信がないです。例として挙げられているブログのケースは「自動更新するプラグインが導入されているので証明書の期限自体は短くて問題ない」だと捉えたのですが、間違っていたら教えてください。
  2. 証明書の料金に関しては発行枚数によっては逆転しますが、、
  3. 日本語のコンソールでは「保留中の証明書」となっていますが、原文は「Pending certificate」であり、「証明書の保留中」と読んだ方が自然そうです。