KAKEHASHI Tech Blog

カケハシのEngineer Teamによるブログです。

RDSの新証明書の有効期限を考える

RDSの50年, 100年有効な認証局証明書

2023年1月13日のリリースで、RDS向けの新しい認証局(CA)証明書が提供されました。

新しいCA証明書には以下の特徴があります

  • 有効期限が50年あるいは100年と長い
    • RSA 2048bitの証明書が50年で、RSA 4096bit, ECDSA 384bitのものが100年
    • これまでのCA証明書は有効期限が5年
  • ECDSA形式の証明書が提供されている
    • RSAと比べて短い鍵長で高いビットセキュリティが得られる。具体的にはECDSA 384bitはRSA 7680bitと同等の強度 *1
  • サーバ証明書の自動更新をサポート

新しいCA証明書はこれまでの5年と比べて50年あるいは100年と非常に長く、ほとんどの用途でCA証明書の更新が必要になることはなさそうです。

なお現行証明書rds-ca-2019の有効期限は2024年8月23日です。現在このCA証明書を使っている人は計画的に証明書を更新しましょう。

CA証明書の有効期限≠サーバ証明書の有効期限

では、新しいCA証明書を使っていれば50年ないし100年間は証明書更新が不要なのか、といえばそうではありません。最大100年有効なのはCA証明書で、RDSインスタンスに設定されるサーバ証明書の有効期限はそれより短く設定されています。旧CA証明書は有効期限が短かったこともあり、サーバ証明書と同じ5年になっていましたが、CAの有効期限が長くなったことで仕様が変わっています。発行されるサーバ証明書の有効期限はドキュメントに明記されていませんが、HTTPSと同じようにtestssl.shなどを使って確認できます。

たとえばAurora(MySQL) 5.7インスタンスに対して実行した場合はこのような結果が得られます。

$ testssl.sh -t mysql rds-test-instance-1.*****.ap-northeast-1.rds.amazonaws.com:3306

(省略)
 TLS extensions (standard)    "renegotiation info/#65281" "EC point formats/#11" "session ticket/#35" "extended master secret/#23"
 Session Ticket RFC 5077 hint 7200 seconds, session tickets keys seems to be rotated < daily
 SSL Session ID support       yes
 Session Resumption           Tickets: yes, ID: yes
 TLS clock skew               0 sec from localtime
 Client Authentication        optional
 CA List for Client Auth      empty
 Signature Algorithm          SHA256 with RSA
 Server key size              RSA 2048 bits (exponent is 65537)
 Server key usage             --
 Server extended key usage    --
 Serial                       ***** (OK: length 16)
 Fingerprints                 SHA1 *****
                              SHA256 *****
 Common Name (CN)             rds-test-instance-1.*****.ap-northeast-1.rds.amazonaws.com 
 subjectAltName (SAN)         rds-test-instance-1.*****.ap-northeast-1.rds.amazonaws.com
                              rds-test.cluster-*****.ap-northeast-1.rds.amazonaws.com
                              rds-test.cluster-ro-*****.ap-northeast-1.rds.amazonaws.com 
 Trust (hostname)             Ok via SAN and CN (same w/o SNI)
 Chain of trust               NOT ok (chain incomplete)
 EV cert (experimental)       no 
 Certificate Validity (UTC)   1095 >= 60 days (2023-07-03 04:34 --> 2026-07-03 04:34)
                              > 398 days issued after 2020/09/01 is too long
(省略)

Certificate Validityがサーバ証明書の有効期限なので、この場合有効期限3年です。同様に他のDBエンジンでも調べると下表の通りになります。実はAurora(MySQL)だけ他より有効期限が長く設定されていることがわかります。

DBエンジン 有効期限
MySQL 1年
PostgreSQL 1年
Aurora(MySQL) 3年
Aurora(PostgreSQL) 1年

サーバ証明書の自動更新

上記の通り1年または3年おきにサーバ証明書の更新が発生します。ですが、新CAはサーバ証明書の自動更新をサポートしており、DBエンジンが対応していれば無停止で証明書が更新されます。ちょうどACMで発行されるサーバ証明書が自動更新されるのと同じようなものです。

RDSのユーザーガイドによれば、

使用可能な CA は SupportedCACertificateIdentifiers に記載されます。出力には、DB エンジンのバージョンで、SupportsCertificateRotationWithoutRestart の再起動なしで証明書のローテーションがサポートされるかどうかも表示されます。

と記述されおり、SupportsCertificateRotationWithoutRestartパラメーターがtrueなら無停止でサーバ証明書が更新されます。一方falseなら、サーバ証明書の更新時にRDSインスタンスの再起動が必要です。この値はAWS CLIならaws rds describe-db-engine-versionsコマンドを使って確認できますので、実際にMySQL, PostgreSQL, Aurora(MySQL), Aurora(PostgreSQL)について調べてみました。見やすさのため、証明書以外の出力はjqコマンドで削除しています。たとえばMySQLなら下記のような出力です。

# MySQL
$ aws rds describe-db-engine-versions --engine mysql | jq -r '.DBEngineVersions[] | [.Engine, .EngineVersion, .SupportsCertificateRotationWithoutRestart] | @csv '
"mysql","5.7.37",false
"mysql","5.7.38",false
"mysql","5.7.39",false
"mysql","5.7.40",false
"mysql","5.7.41",false
"mysql","5.7.42",false
"mysql","8.0.28",true
"mysql","8.0.31",true
"mysql","8.0.32",true
"mysql","8.0.33",true

AuroraはProvisionedとServerlessで仕様が異なるので、モードも出力します。たとえばAurora(PostgreSQL)なら下記のような出力です。

$ aws rds describe-db-engine-versions  --engine aurora-postgresql | jq -r '.DBEngineVersions[] | [.Engine, .EngineVersion, .SupportedEngineModes[], .SupportsCertificateRotationWithoutRestart] | @csv '
"aurora-postgresql","11.9","provisioned",true
"aurora-postgresql","11.13","provisioned",true
"aurora-postgresql","11.14","provisioned",true
(省略)
"aurora-postgresql","13.9","serverless",false
"aurora-postgresql","13.10","provisioned",true
"aurora-postgresql","13.11","provisioned",true
(省略)
"aurora-postgresql","14.8","provisioned",true
"aurora-postgresql","15.2","provisioned",true
"aurora-postgresql","15.3","provisioned",true

調べた結果は以下のとおりです。あくまで2023年7月14日現在の結果なので、今後のバージョンでは変更される可能性があります。

  • MySQLは8.xのみ自動ローテーション対応
    • もっとも、MySQL5.7のRDS標準サポートは2023年12月に終了予定のため、どのみち近く強制アップデート対象になるものと思われます。
  • PostgreSQLは現行の全バージョンで自動ローテーション対応
  • Aurora(MySQL)は全バージョンで自動ローテーション非対応
  • Aurora(PostgreSQL)はProvisionedモードのみ対応

注意すべきはAurora(MySQL)で、現行のどのバージョンでも自動ローテーションに対応しません。したがって、3年おきに証明書の更新再起動が必要です。Aurora(MySQL)のみ他のDBエンジンよりも長期間のサーバ証明書が発行されているのは、おそらく自動更新ができないためでしょう。

まとめ

RDSのCA証明書が新しくなり、MySQL, PostgreSQL, Aurora(PostgreSQL)を使っている人は、RDSサーバ証明書の自動更新ができるようになりました。これにより、これまでの5年に一度の証明書更新作業が不要になります。一方Aurora(MySQL)は証明書の有効期限が3年に短縮され、自動更新にも対応しないので更新負荷が多少なりとも増えてしまいました。いずれAurora(MySQL)も自動更新をサポートすることを楽しみに待ちましょう。

*1) CRYPTREC 暗号強度要件(アルゴリズム及び鍵長選択)に関する設定基準(2022年3月)より