[新機能]ACM Private Certificate Authorityを試してみた

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

西澤です。AWS Summit 2018 San Franciscoで発表されたACMの新機能であるPrivate Certificate Authorityを使って、プライベートな認証局を作ってみました。調べながらとりあえず動くところまではたどり着きましたが、不適切な箇所などあればご指摘いただけますと助かります。

ACMプライベートCAを利用する上での注意

今回リリースされたACMのプライベートCAを利用したマネージドなプライベート認証局を用意することにより、プライベートな証明書を任意の名前やライフサイクルで自由に管理することが可能となります。ただし、以下の点に注意が必要です。

  • ACMプライベートCAは下位CAとして作成する為、上位CAによる署名が必要です。
  • ACMプライベートCA1つにつき、$400/月の料金がかかります。(一度作成すると、30日間の無効化期間を経なければ削除できない仕様のようですのでご注意ください)

 料金の詳細については、下記よりご確認ください。

ACMプライベートCAを試してみた

何はともあれ試してみました。以下が試した手順の大きな流れとなります。

  1. 上位CAとなる認証局を用意(※非AWS作業)
  2. ACMプライベートCAを作成
  3. ACMプライベートCAでCSRを作成
  4. 上位CAで署名(※非AWS作業)
  5. 証明書のインポート

"※非AWSの作業"としたところは、今回はAmazon Linuxで暫定のプライベートCAを用意して試しています。

1. 上位CAとなる認証局を用意(※非AWS作業)

今回は、Amazon Linux環境を用意して、opensslの/etc/pki/tls/misc/CAスクリプトを利用して試してみました。まずは、利用するopenssl.cnfを以下のように編集しました。

# cat /etc/pki/tls/openssl.cnf
  〜〜〜
[ CA_default ]
  〜〜〜
default_days	= 3650			# how long to certify for
  〜〜〜
[ v3_ca ]
  〜〜〜
basicConstraints = critical,CA:true
  〜〜〜
  • default_days: 後でリクエストするサーバ証明書の有効期限が1年なので、それよりも長い期間を指定する必要があります。
  • basicConstraints: critical指定が無いとエラーとなり正常に動作しなかった為、指定しました。

-newcaオプションを指定して認証局を作りました。

# /etc/pki/tls/misc/CA -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 2048 bit RSA private key
...........................................................................................................................+++
..........+++
writing new private key to '/etc/pki/CA/private/./cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Chiyoda-ku
Organization Name (eg, company) [Default Company Ltd]:company
Organizational Unit Name (eg, section) []:division
Common Name (eg, your name or your server's hostname) []:private-root-ca
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/./cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            82:ab:42:26:af:11:1c:f4
        Validity
            Not Before: Apr  5 16:08:49 2018 GMT
            Not After : Apr  4 16:08:49 2021 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = company
            organizationalUnitName    = division
            commonName                = private-root-ca
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                E0:47:E3:E0:6E:81:B7:5E:90:3E:DB:52:93:A4:99:E1:03:BF:BF:C4
            X509v3 Authority Key Identifier:
                keyid:E0:47:E3:E0:6E:81:B7:5E:90:3E:DB:52:93:A4:99:E1:03:BF:BF:C4

            X509v3 Basic Constraints: critical
                CA:TRUE
Certificate is to be certified until Apr  4 16:08:49 2021 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated

以下のようなCA証明書(cacert.pem)が作成されました。(※後の手順でファイル内の証明書を"証明書チェーン"に設定)

# cat /etc/pki/CA/cacert.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            82:ab:42:26:af:11:1c:f4
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=JP, ST=Tokyo, O=company, OU=division, CN=private-root-ca
        Validity
            Not Before: Apr  5 16:08:49 2018 GMT
            Not After : Apr  4 16:08:49 2021 GMT
        Subject: C=JP, ST=Tokyo, O=company, OU=division, CN=private-root-ca
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:c6:2a:b5:e4:50:9c:63:ce:f3:06:bb:12:13:33:
                      〜〜〜
                    22:eb
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                E0:47:E3:E0:6E:81:B7:5E:90:3E:DB:52:93:A4:99:E1:03:BF:BF:C4
            X509v3 Authority Key Identifier:
                keyid:E0:47:E3:E0:6E:81:B7:5E:90:3E:DB:52:93:A4:99:E1:03:BF:BF:C4

            X509v3 Basic Constraints: critical
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         61:c0:01:1a:6d:c7:0b:cb:8d:f8:0e:5e:2e:ec:ad:6a:25:53:
           〜〜〜
         dd:63:2c:09
-----BEGIN CERTIFICATE-----
MIIDjjCCAnagAwIBAgIJAIKrQiavERz0MA0GCSqGSIb3DQEBCwUAMFwxCzAJBgNV
  〜〜〜(ここをあとでコピペする)〜〜〜
LAk=
-----END CERTIFICATE-----

2. ACMプライベートCAを作成

それでは、AWS側でプライベートCAを作っていきます。

ここでは下位CAしか選べませんので、そのまま次へ。

今回は認証機関名の設定は適当なもので済ませました。プライベートな用途とはなるものの、本来であれば管理しやすい形で入力べきすべきところかと思います。

デフォルトはRSA 2048になりますが、他も選ぶことができます。

証明書失効リストも管理できるようですが、今回は有効にはしませんでした。

設定内容を確認して、"確認と作成"をクリックします。

CAが作成されました!

3. ACMプライベートCAでCSRを作成

次に証明書のインポートをする為に、CSRを作成します。ここでは、"CA証明書のインポート"を選択することで、CSRが表示されるのでそれを利用します。

こちらに表示されたCSRを利用して署名します。

4. 上位CAで署名(※非AWS作業)

CSRの署名は上位の認証局で行う必要があるので、先ほど用意したAmazon Linuxで対応します。まずは、先ほど表示したCSRの中身を"newreq.pem"にそのまま貼り付けて保存します。

# vi /etc/pki/CA/newreq.pem
-----BEGIN CERTIFICATE REQUEST-----
MIICzjCCAbgCAQAwbDELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMRMwEQYD
  〜〜〜(CSRの内容をコピペ)〜〜〜
gMY=
-----END CERTIFICATE REQUEST-----

今度は、-signCAオプションを指定して、先ほどのCSR(newreq.pem)を上位CAから署名します。

# /etc/pki/tls/misc/CA -signCA
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            82:ab:42:26:af:11:1c:f5
        Validity
            Not Before: Apr  5 16:12:41 2018 GMT
            Not After : Apr  5 16:12:41 2019 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            localityName              = Chiyoda-ku
            organizationName          = company
            organizationalUnitName    = division
            commonName                = private-ca
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                15:0A:7B:32:E3:56:C3:DE:F6:3F:7B:8C:DB:86:BF:69:D4:A3:54:33
            X509v3 Authority Key Identifier:
                keyid:E0:47:E3:E0:6E:81:B7:5E:90:3E:DB:52:93:A4:99:E1:03:BF:BF:C4

            X509v3 Basic Constraints: critical
                CA:TRUE
Certificate is to be certified until Apr  5 16:12:41 2019 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Signed CA certificate is in newcert.pem

署名された証明書(newcert.pem)が作成されました。(※後の手順でファイル内の証明書を"証明書本文"に設定)

# cat /etc/pki/CA/newcert.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            82:ab:42:26:af:11:1c:f5
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=JP, ST=Tokyo, O=company, OU=division, CN=private-root-ca
        Validity
            Not Before: Apr  5 16:12:41 2018 GMT
            Not After : Apr  5 16:12:41 2019 GMT
        Subject: C=JP, ST=Tokyo, L=Chiyoda-ku, O=company, OU=division, CN=private-ca
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:bb:b1:7b:40:37:9c:06:9c:a6:ad:7e:13:ff:a2:
                      〜〜〜
                    4a:73
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                15:0A:7B:32:E3:56:C3:DE:F6:3F:7B:8C:DB:86:BF:69:D4:A3:54:33
            X509v3 Authority Key Identifier:
                keyid:E0:47:E3:E0:6E:81:B7:5E:90:3E:DB:52:93:A4:99:E1:03:BF:BF:C4

            X509v3 Basic Constraints: critical
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         73:df:fb:93:0c:9d:37:9f:26:1a:3a:f3:4b:79:d3:3f:9f:d3:
           〜〜〜
				 df:7d:78:de
-----BEGIN CERTIFICATE-----
MIIDnjCCAoagAwIBAgIJAIKrQiavERz1MA0GCSqGSIb3DQEBCwUAMFwxCzAJBgNV
  〜〜〜(ここをあとでコピペする)〜〜〜
dAmIwBOddqfoAsAUjFnffXje
-----END CERTIFICATE-----

5. 証明書のインポート

ここで、AWS Management Consoleに戻り、証明書のインポートを行います。

  • 証明書本文: /etc/pki/CA/newcert.pemの内容をコピペ
  • 証明書チェーン: /etc/pki/CA/cacert.pemの内容をコピペ

無事にインポートに成功しました!

以上で、プライベートCAの設定は完了です。本来であれば、上位認証局をどうするかは検討が必要かと思いますが、今回はひとまず流れと手順を確認できるように仮のものでやってみました。

プライベートな証明書も発行してみた

せっかくなので、ACMプライベートCAを使って、証明書の作成まで確認してみます。リクエストの方法はこれまでのものと変わりません。

ここで選択肢が追加されています。"プライベートな証明書のリクエスト"を選ぶことで、設定したプライベートCAを選択することができます。

プライベートCAが署名をしてくれるので、適当なドメイン名の証明書でも問題ありません。

これまでのようなメール認証やDNS認証なしで、証明書を作成することができました!

プライベートCAで署名した証明書はエクスポートして利用することも可能です。

AWSリソース以外でも利用できるので、これは便利に使えそうですね。

まとめ

プライベートCAを構築したことが無かったので、少々手間取りましたが、ACMプライベートCAのひと通りの動作確認をすることができました。実は費用のところをきちんと確認せずに試し始めてしまったので、今とても心配になっています。無料枠がきちんと適用されると良いのですが、、、

どこかの誰かのお役に立てば嬉しいです。