ACMで発行した証明書の検証で使うCNAMEレコードを削除してみた

ACMで発行した証明書の検証で使うCNAMEレコードを削除しても、直ちに証明書が失効する訳ではないよ
2022.09.22

削除してしまったらどうなるんだろう

こんにちは、のんピ(@non____97)です。

皆さんはACMで発行した証明書の検証で使うCNAMEレコードを削除するとどんな挙動をするのか気になったことはありますか? 私はあります。

AWS公式ドキュメントを確認すると以下のような記載がありました。

自動更新を停止するには、関連付けられている AWS サービスから証明書を削除するか、CNAME レコードを削除します。

DNS での検証 - AWS Certificate Manager

見たところ自動更新が止まるだけで、証明書が直ちに失効する訳ではなさそうです。

ただ、今までやったことなかったので、実際にACMで発行した証明書の検証で使うCNAMEレコードを削除してみました。

いきなりまとめ

  • 検証した限り、ACMで発行した証明書の検証で使うCNAMEレコードを削除しても、直ちに証明書が失効する訳ではない
  • CNAMEレコードがない状態で期限を迎えると、証明書の自動更新がされないので放置は禁物

検証環境

検証環境は以下の通りです。

構成図

ACMで発行した証明書の検証で使うCNAMEレコードをRoute 53のPublic Hosted Zoneに登録します。

また、NLBのターゲットにNAT GatewayへのルーティングないEC2インスタンスを指定したことがなかったので、NLBでTLSリスナーを使用しています。

NLBに対して警告なくHTTPSでアクセスできることを確認した上で、検証用のCNAMEレコードを削除し、再度警告なくHTTPSでアクセスできることを確認します。

検証環境の構築

検証環境の構築はほぼAWS CDKで行います。

使用したコードは以下リポジトリに保存しています。

npx cdk deployで各種リソースをデプロイします。

途中、Public Hosted Zoneの作成が完了したら、作成したPublic Hosted ZoneのNSレコードを上位のDNSサーバーに登録します。

私の場合、検証で使用するacm-test.non-97.netの上位のドメインであるnon-97.netはGoogle Domainsで管理しているので、Google DomainsのDNSにNSレコードを追加します。

NSレコードの追加

Public Hosted ZoneのNSレコードの追加が完了すると、処理が進みます。

デプロイ後、Public Hosted ZoneにACMで発行した証明書の検証で使うCNAMEレコードと、NLBのALIASのAレコードがあることを確認します。

Public Hosted Zoneの確認

また、ACMから発行した証明書のステータスが発行済みであることを確認します。

ACMで発行した証明書の確認

HTTPSで通信できることを確認

それではNLBにHTTPSで通信できることを確認します。

ブラウザで `https://acm-test.non-97.net` にアクセスするとNginxのテストページが警告なく表示されました。

Nginxのテストページを確認

証明書ビューアから使用されている証明書も確認してみます。

証明書ビューア

CNが有効期限が発行日の1年後になっていることが分かります。

OpenSSLを使ってコマンドからも証明書を確認してみます。

> echo | openssl s_client -connect acm-test.non-97.net:443
CONNECTED(00000005)
depth=4 C = US, O = "Starfield Technologies, Inc.", OU = Starfield Class 2 Certification Authority
verify return:1
depth=3 C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Services Root Certificate Authority - G2
verify return:1
depth=2 C = US, O = Amazon, CN = Amazon Root CA 1
verify return:1
depth=1 C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
verify return:1
depth=0 CN = acm-test.non-97.net
verify return:1
---
Certificate chain
 0 s:/CN=acm-test.non-97.net
   i:/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon
 1 s:/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon
   i:/C=US/O=Amazon/CN=Amazon Root CA 1
 2 s:/C=US/O=Amazon/CN=Amazon Root CA 1
   i:/C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Services Root Certificate Authority - G2
 3 s:/C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Services Root Certificate Authority - G2
   i:/C=US/O=Starfield Technologies, Inc./OU=Starfield Class 2 Certification Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIF4DCCBMigAwIBAgIQCzQwXVwmuQn4/9n9ggUeVjANBgkqhkiG9w0BAQsFADBG
MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRUwEwYDVQQLEwxTZXJ2ZXIg
Q0EgMUIxDzANBgNVBAMTBkFtYXpvbjAeFw0yMjA5MjIwMDAwMDBaFw0yMzEwMjIy
MzU5NTlaMB4xHDAaBgNVBAMTE2FjbS10ZXN0Lm5vbi05Ny5uZXQwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1s9N5nkPCy6K4MptHpOj1WoT1vZEiI210
oMT3kHqTIgUObVem7Cj+JeeEL2DfH/1MagNdRHIf8Ph3saer7HT8IHL1bo2wryvb
bd2f3/hoZon9cR59RXe7wCJ8cItUCJ2ZdOWCY2hTvodh5qrsSV5iB5xIGjHJK7PR
1YpXo7/Tj07WF15hj0H+nC3OHIMWlF5vwdWHk6SB/D+JjRjJw9jjsTirJQeMYVRx
oIyyVsWpdCKs4dYUHScYeBRtpW1llJX3BZ0BxQtK3D+eoUUzOhMC5v0yhSdomtB1
04c2oOOF5xLghvS9qEJ9rpS7qyyNAWbGyjZc4ZWvnXtgh7VwcvOpAgMBAAGjggLw
MIIC7DAfBgNVHSMEGDAWgBRZpGYGUqB7lZI8o5QHJ5Z0W/k90DAdBgNVHQ4EFgQU
RkrH8/sAphge94ppx6ibCi990A4wHgYDVR0RBBcwFYITYWNtLXRlc3Qubm9uLTk3
Lm5ldDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6Ly9jcmwuc2NhMWIuYW1hem9udHJ1
c3QuY29tL3NjYTFiLTEuY3JsMBMGA1UdIAQMMAowCAYGZ4EMAQIBMHUGCCsGAQUF
BwEBBGkwZzAtBggrBgEFBQcwAYYhaHR0cDovL29jc3Auc2NhMWIuYW1hem9udHJ1
c3QuY29tMDYGCCsGAQUFBzAChipodHRwOi8vY3J0LnNjYTFiLmFtYXpvbnRydXN0
LmNvbS9zY2ExYi5jcnQwDAYDVR0TAQH/BAIwADCCAYAGCisGAQQB1nkCBAIEggFw
BIIBbAFqAHcA6D7Q2j71BjUy51covIlryQPTy9ERa+zraeF3fW0GvW4AAAGDY4q+
ZgAABAMASDBGAiEA+caqt8dPW+aKG9J0C8tba+xHUfHOGnS4FnbH5Kmr7WACIQDu
ev2HLQ8g1nWqwnQnkV6Q+tXWp/eFUnSlWE6XPrsCQwB2ADXPGRu/sWxXvw+tTG1C
y7u2JyAmUeo/4SrvqAPDO9ZMAAABg2OKvqoAAAQDAEcwRQIhAIQnzovE3DxDH4+X
gGA+tT8dfp2UCvLXCm4S/Ct21wtOAiAW0Yzxr1DLPeQisJ8OOSKJjrnSZ0BZa8B9
thZbiJU3ggB3ALNzdwfhhFD4Y4bWBancEQlKeS2xZwwLh9zwAw55NqWaAAABg2OK
vt0AAAQDAEgwRgIhAJNdldUWVR+pcYXKSOyelwyam/YbyJO9moGprOwgtvAbAiEA
lwHflWLrgRnAAnVMrzbGrxoM9ScatDjczOfk/JA1YyswDQYJKoZIhvcNAQELBQAD
ggEBAISfUr9BgbA6ZNfy+GbfMcGHSEsD/vTJ6tMLeNOXCSUqr8RRiCOLW6isuKTj
YgZjUBjxdjwF6awBYoGO6GwWgSgPWq6w1/dDZx8cZ+6dXBwOyHp3KT4ozaA3bDaA
Vm2RAz+gDmsd5FNhNfsEJOTZJ2CPcE3WmkFB5uhlte0+Vr+dF6JypeV11/px2qnx
IU+2v+4+IKv0J7JqALm0faTTDy3BS+9Sp29zM78Lv8LZjiBYzG0LJR+YlQsuRZnG
dJu3udqsx3VwXPhZ7dvjj7Qr/cHkoDtLxrYTPIGwHHXJhVN+euhnk8jGeAKDIyIO
1ZbmQ8xbheSGYSSj8yiWQ19Zrko=
-----END CERTIFICATE-----
subject=/CN=acm-test.non-97.net
issuer=/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon
---
No client certificate CA names sent
Server Temp Key: ECDH, X25519, 253 bits
---
SSL handshake has read 5532 bytes and written 289 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 2B5570C16BEB0A42B95364A401EF68FFA3D7419763D4E485886B518E39379C41
    Session-ID-ctx:
    Master-Key: 6AC78D962DDF853F11153395D807EB0C2AC0010EE18078092CC444D859941185236BD6DF253A4D4A72D9041A2C698B9D
    TLS session ticket lifetime hint: 172800 (seconds)
    TLS session ticket:
    0000 - 53 53 4b 2d 45 30 30 34-36 32 31 36 31 00 00 00   SSK-E00462161...
    0010 - 9c 93 61 d4 f3 39 d1 f6-1c f1 e7 58 8b 0e 8a b1   ..a..9.....X....
    0020 - a7 51 82 ce 33 62 b3 fa-fc ae 3f 99 b5 83 40 91   .Q..3b....?...@.
    0030 - 67 c4 90 99 c7 06 e9 0b-c6 b4 ae 36 fd e6 48 b1   g..........6..H.
    0040 - 04 33 60 9c 26 b2 1c d9-05 8b ca 93 40 12 f5 9a   .3`.&.......@...
    0050 - c6 03 c2 bf ef 2f 68 b3-f6 32 de 74 3f 45 80 ac   ...../h..2.t?E..
    0060 - d8 97 2b 5e 86 2b 7f 81-                          ..+^.+..

    Start Time: 1663828193
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---
DONE

ニヤニヤしますね。

コマンドつながりでcurlを使ってアクセスしてみます。

> curl https://acm-test.non-97.net/ -v
*   Trying 52.0.220.125:443...
* Connected to acm-test.non-97.net (52.0.220.125) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/cert.pem
*  CApath: none
* (304) (OUT), TLS handshake, Client hello (1):
* (304) (IN), TLS handshake, Server hello (2):
* (304) (IN), TLS handshake, Unknown (8):
* (304) (IN), TLS handshake, Certificate (11):
* (304) (IN), TLS handshake, CERT verify (15):
* (304) (IN), TLS handshake, Finished (20):
* (304) (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / AEAD-AES128-GCM-SHA256
* ALPN, server did not agree to a protocol
* Server certificate:
*  subject: CN=acm-test.non-97.net
*  start date: Sep 22 00:00:00 2022 GMT
*  expire date: Oct 22 23:59:59 2023 GMT
*  subjectAltName: host "acm-test.non-97.net" matched cert's "acm-test.non-97.net"
*  issuer: C=US; O=Amazon; OU=Server CA 1B; CN=Amazon
*  SSL certificate verify ok.
> GET / HTTP/1.1
> Host: acm-test.non-97.net
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx/1.20.0
< Date: Thu, 22 Sep 2022 05:51:11 GMT
< Content-Type: text/html
< Content-Length: 3520
< Last-Modified: Tue, 12 Jul 2022 01:09:57 GMT
< Connection: keep-alive
< ETag: "62ccc9e5-dc0"
< Accept-Ranges: bytes
<
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <title>Test Page for the Nginx HTTP Server on Amazon Linux</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <style type="text/css">
            /*<![CDATA[*/
            body {
                background-color: #fff;
                color: #000;
                font-size: 0.9em;
                font-family: sans-serif,helvetica;
                margin: 0;
                padding: 0;
            }
            :link {
                color: #c00;
            }
            :visited {
                color: #c00;
            }
            a:hover {
                color: #f50;
            }
            h1 {
                text-align: center;
                margin: 0;
                padding: 0.6em 2em 0.4em;
                background-color: #294172;
                color: #fff;
                font-weight: normal;
                font-size: 1.75em;
                border-bottom: 2px solid #000;
            }
            h1 strong {
                font-weight: bold;
                font-size: 1.5em;
            }
            h2 {
                text-align: center;
                background-color: #3C6EB4;
                font-size: 1.1em;
                font-weight: bold;
                color: #fff;
                margin: 0;
                padding: 0.5em;
                border-bottom: 2px solid #294172;
            }
            hr {
                display: none;
            }
            .content {
                padding: 1em 5em;
            }
            .alert {
                border: 2px solid #000;
            }

            img {
                border: 2px solid #fff;
                padding: 2px;
                margin: 2px;
            }
            a:hover img {
                border: 2px solid #294172;
            }
            .logos {
                margin: 1em;
                text-align: center;
            }
            /*]]>*/
        </style>
    </head>

    <body>
        <h1>Welcome to <strong>nginx</strong> on Amazon Linux!</h1>

        <div class="content">
            <p>This page is used to test the proper operation of the
            <strong>nginx</strong> HTTP server after it has been
            installed. If you can read this page, it means that the
            web server installed at this site is working
            properly.</p>

            <div class="alert">
                <h2>Website Administrator</h2>
                <div class="content">
                    <p>This is the default <tt>index.html</tt> page that
                    is distributed with <strong>nginx</strong> on
                     Amazon Linux.  It is located in
                    <tt>/usr/share/nginx/html</tt>.</p>

                    <p>You should now put your content in a location of
                    your choice and edit the <tt>root</tt> configuration
                    directive in the <strong>nginx</strong>
                    configuration file
                    <tt>/etc/nginx/nginx.conf</tt>.</p>

                </div>
            </div>

            <div class="logos">
                <a href="http://nginx.net/"><img
                    src="nginx-logo.png"
                    alt="[ Powered by nginx ]"
                    width="121" height="32" /></a>
            </div>
        </div>
    </body>
</html>
* Connection #0 to host acm-test.non-97.net left intact

無事にアクセスできました。

ACMで発行した証明書の検証で使うCNAMEレコードを削除

それでは、ACMで発行した証明書の検証で使うCNAMEレコードを削除してみます。

Route 53のPublic Hosted Zoneから対象のCNAMEレコードを削除します。

証明書のCNAMEの削除

CNAMEレコードが削除されたことを確認します。

CNAMEレコードが削除されたことを確認

CNAMEレコード削除後にもHTTPSで通信できることを確認

CNAMEレコード削除後にもHTTPSで通信できることを確認します。

ブラウザで `https://acm-test.non-97.net` にアクセスするとNginxのテストページが警告なく表示されました。

CNAMEレコード削除後もNginxのテストページを確認

curlからも変わらずアクセスできました。

> curl https://acm-test.non-97.net/ -I
HTTP/1.1 200 OK
Server: nginx/1.20.0
Date: Thu, 22 Sep 2022 06:45:39 GMT
Content-Type: text/html
Content-Length: 3520
Last-Modified: Tue, 12 Jul 2022 01:09:57 GMT
Connection: keep-alive
ETag: "62ccc9e5-dc0"
Accept-Ranges: bytes

5分後、10分後、1時間後もアクセスしましたが、警告なく変わらずアクセスできました。

また、ACMからも証明書のステータスは変わらず発行済みであることを確認できました。

CNAMEレコード削除後の証明書のステータスを確認

ということで、ACMで発行した証明書の検証で使うCNAMEレコードを削除しても、直ちに証明書が失効する訳ではないことが分かりました。

なお、証明書で指定したFQDNではなく、NLBのDNS名を指定してアクセスすると以下のように怒られます。

> curl https://WebSt-NLB55-IZ08EMHKVF5X-add3381ef9fd3bc4.elb.us-east-1.amazonaws.com -I
curl: (60) SSL: no alternative certificate subject name matches target host name 'WebSt-NLB55-IZ08EMHKVF5X-add3381ef9fd3bc4.elb.us-east-1.amazonaws.com'
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

直ちに証明書が失効する訳ではない

ACMで発行した証明書の検証で使うCNAMEレコードを削除した際の挙動を確認してみました。

直ちに証明書が失効する訳ではないので安心ですね。IaCでDNSレコードを管理している場合、どうしても一瞬削除が行われてしまうみたいなケースはあると思うので、参考にしてもらえればと思います。

ただし、CNAMEレコードがない状態で期限を迎えると、証明書の自動更新がされないので放置は禁物です。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!