轮换 SSL/TLS 证书 - Amazon Relational Database Service

轮换 SSL/TLS 证书

Amazon RDS 证书颁发机构证书 rds-ca-2019 将于 2024 年 8 月到期。如果您使用或计划使用带有证书验证的安全套接字层(SSL)或传输层安全性协议(TLS)来连接您的 RDS 数据库实例或多可用区数据库集群则考虑使用新的 CA 证书之一:rds-ca-rsa2048-g1、rds-ca-rsa4096-g1 或 rds-ca-ecc384-g1。如果您当前未将 SSL/TLS 用于证书验证,则可能仍有过期的 CA 证书,如果您计划为证书验证使用 SSL/TLS 连接到 RDS 数据库,则必须将它们更新为新的 CA 证书。

Amazon RDS 提供新 CA 证书作为AWS最佳安全实践。有关新证书和受支持的 AWS 区域的信息,请参阅 使用 SSL/TLS 加密与数据库实例或集群的连接

要更新数据库的 CA 证书,请使用以下方法:

更新数据库实例或多可用区数据库集群来使用新的 CA 证书之前,请确保更新连接到 RDS 数据库的客户端或应用程序。

轮换证书的注意事项

在轮换证书之前,请考虑以下情况:

  • Amazon RDS 代理使用来自 AWS Certificate Manager (ACM) 的证书。如果您使用的是 RDS 代理,当您轮换 SSL/TLS 证书时,您不需要更新使用 RDS 代理连接的应用程序。有关更多信息,请参阅 将 TLS/SSL 与 RDS Proxy 结合使用

  • 如果您将 Go 版本 1.15 应用程序与在 2020 年 7 月 28 日之前创建或更新到 rds-ca-2019 证书的数据库实例或多可用区数据库集群一起使用,则必须再次更新证书。将证书更新为 rds-ca-rsa2048-g1、rds-ca-rsa4096-g1 或 rds-ca-ecc384-g1,具体取决于您的引擎

    使用新的 CA 证书标识符,对数据库实例运行 modify-db-instance 命令,或对多可用区数据库集群运行 modify-db-cluster 命令。您可以使用 describe-db-engine-versions 命令找到适用于特定数据库引擎和数据库引擎版本的 CA。

    如果您在 2020 年 7 月 28 日之后创建了数据库或更新了其证书,则无需执行任何操作。有关更多信息,请参阅 Go GitHub 问题 #39568

通过修改数据库实例或集群来更新 CA 证书

以下示例将您的 CA 证书从 rds-ca-2019 更新为 rds-ca-rsa2048-g1您可以选择不同的证书。有关更多信息,请参阅证书颁发机构

更新您的应用程序信任存储,以减少任何与更新 CA 证书相关的停机时间。有关与 CA 证书轮换相关的重启的更多信息,请参阅自动服务器证书轮换

通过修改数据库实例或集群来更新 CA 证书
  1. 下载新的 SSL/TLS 证书,如 使用 SSL/TLS 加密与数据库实例或集群的连接 中所述。

  2. 更新应用程序以使用新的 SSL/TLS 证书。

    更新应用程序以使用新 SSL/TLS 证书的方法取决于特定的应用程序。请与应用程序开发人员一起更新应用程序的 SSL/TLS 证书。

    有关检查 SSL/TLS 连接和更新每个数据库引擎的应用程序的信息,请参阅以下主题:

    有关更新 Linux 操作系统信任存储的示例脚本,请参阅将证书导入信任存储的示例脚本

    注意

    证书捆绑包包含新旧 CA 证书,因此您可以安全地升级应用程序并在转换期间保持连接。如果您正在使用 AWS Database Migration Service 将数据库迁移到数据库实例或集群,我们建议您使用证书捆绑包来确保迁移期间的连接性。

  3. 修改数据库实例或多可用区数据库集群,以便将 CA 从 rds-ca-2019 更改为 rds-ca-rsa2048-g1。要检查您的数据库是否需要重启才能更新 CA 证书,请使用 describe-db-engine-versions 命令并检查 SupportsCertificateRotationWithoutRestart 标志。

    重要

    如果您在证书到期后遇到连接问题,请通过在控制台中指定 Apply immediately (立即应用) 或者 使用 --apply-immediately 指定 AWS CLI 选项来使用“立即应用”选项。默认情况下,此操作安排在您的下个维护时段运行。

    要为与默认 RDS CA 不同的实例 CA 设置覆盖,请使用 modify-certificates CLI 命令。

您可以使用 AWS Management Console或 AWS CLI,对于数据库实例或多可用区数据库集群,将 CA 证书从 rds-ca-2019 更改为 rds-ca-rsa2048-g1

Console
  1. 登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 在导航窗格中,选择数据库,然后选择要修改的数据库实例或多可用区数据库集群

  3. 选择修改

    修改数据库实例或多可用区数据库集群
  4. 连接部分中,选择 rds-ca-rsa2048-g1

    选择 CA 证书
  5. 选择继续,查看修改摘要。

  6. 要立即应用更改,请选择立即应用

  7. 在确认页面上,检查您的更改。如果更改正确无误,请选择修改数据库实例修改集群以保存更改。

    重要

    安排此操作时,请确保已预先更新客户端信任存储。

    也可以选择 Back 编辑您的更改,或选择 Cancel 取消更改。

AWS CLI

要使用 AWS CLI 将数据库实例或多可用区数据库集群的 CA 从 rds-ca-2019 更改为 rds-ca-rsa2048-g1,请调用 modify-db-instancemodify-db-cluster 命令。指定数据库实例或集群标识符和 --ca-certificate-identifier 选项。

使用 --apply-immediately 参数可立即应用更新。默认情况下,此操作安排在您的下个维护时段运行。

重要

安排此操作时,请确保已预先更新客户端信任存储。

数据库实例

以下示例通过将 CA 证书设置为 rds-ca-rsa2048-g1 来修改 mydbinstance

对于 Linux、macOS 或 Unix:

aws rds modify-db-instance \ --db-instance-identifier mydbinstance \ --ca-certificate-identifier rds-ca-rsa2048-g1

对于 Windows:

aws rds modify-db-instance ^ --db-instance-identifier mydbinstance ^ --ca-certificate-identifier rds-ca-rsa2048-g1
注意

如果您的实例需要重启,可以使用 modify-db-instance CLI 命令并指定 --no-certificate-rotation-restart 选项。

多可用区数据库集群

以下示例通过将 CA 证书设置为 rds-ca-rsa2048-g1 来修改 mydbcluster

对于 Linux、macOS 或 Unix:

aws rds modify-db-cluster \ --db-cluster-identifier mydbcluster \ --ca-certificate-identifier rds-ca-rsa2048-g1

对于 Windows:

aws rds modify-db-cluster ^ --db-cluster-identifier mydbcluster ^ --ca-certificate-identifier rds-ca-rsa2048-g1

通过应用维护来更新 CA 证书

完成以下步骤,通过应用维护来更新 CA 证书。

Console
通过应用维护来更新 CA 证书
  1. 登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 在导航窗格中,选择证书更新

    证书轮换导航窗格选项

    将显示需要更新证书的数据库页面。

    更新数据库的 CA 证书
    注意

    该页面仅显示当前 AWS 区域的数据库实例和集群。如果您在多个 AWS 区域中有数据库,请检查每个 AWS 区域中的该页面,以查看具有旧 SSL/TLS 证书的所有数据库实例。

  3. 选择要更新的数据库实例或多可用区数据库集群

    您可以通过选择计划来计划下一维护时段的证书轮换。通过选择立即应用来立即应用轮换。

    重要

    如果您在证书到期后遇到连接问题,请使用立即应用选项。

    1. 如果您选择计划,系统会提示您确认 CA 证书轮换。此提示还说明更新的计划时段。

      确认证书轮换
    2. 如果您选择立即应用,系统会提示您确认 CA 证书轮换。

      确认证书轮换
    重要

    在计划数据库上的 CA 证书轮换之前,请更新使用 SSL/TLS 和服务器证书进行连接的所有客户端应用程序。这些更新特定于您的数据库引擎。更新这些客户端应用程序后,可以确认 CA 证书轮换。

    要继续,请选中该复选框,然后选择 Confirm (确认)

  4. 对要更新的每个数据库实例和集群重复步骤 3 和 4。

自动服务器证书轮换

如果根 CA 支持自动服务器证书轮换,RDS 会自动处理数据库服务器证书的轮换。RDS 使用相同的根 CA 进行自动轮换,因此您无需下载新的 CA 服务包。请参阅 证书颁发机构

数据库服务器证书的轮换和有效期取决于您的数据库引擎:

  • 如果您的数据库引擎支持无需重启即可轮换,则 RDS 会自动轮换数据库服务器证书,而无需您执行任何操作。RDS 尝试在您首选的维护时段中,在数据库服务器证书的半生命周期轮换您的数据库服务器证书。新的数据库服务器证书的有效期为 12 个月。

  • 如果您的数据库引擎不支持无需重启即可轮换,则 RDS 会在数据库服务器证书到期前至少 6 个月通知您有关维护事件的信息。新的数据库服务器证书的有效期为 36 个月。

使用 describe-db-engine-versions 命令并检查 SupportsCertificateRotationWithoutRestart标志,以确定数据库引擎版本是否支持无需重启即可轮换证书。有关更多信息,请参阅 为数据库设置 CA

将证书导入信任存储的示例脚本

以下是将证书捆绑包导入信任存储的示例 shell 脚本。

每个示例 Shell 脚本都使用 keytool,它是 Java 开发工具包 (JDK) 的一部分。有关安装 JDK 的信息,请参阅 JDK 安装指南

Linux

下面是一个示例 Shell 脚本,它将证书捆绑包导入 Linux 操作系统上的信任存储。

mydir=tmp/certs if [ ! -e "${mydir}" ] then mkdir -p "${mydir}" fi truststore=${mydir}/rds-truststore.jks storepassword=changeit curl -sS "https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem" > ${mydir}/global-bundle.pem awk 'split_after == 1 {n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1}{print > "rds-ca-" n+1 ".pem"}' < ${mydir}/global-bundle.pem for CERT in rds-ca-*; do alias=$(openssl x509 -noout -text -in $CERT | perl -ne 'next unless /Subject:/; s/.*(CN=|CN = )//; print') echo "Importing $alias" keytool -import -file ${CERT} -alias "${alias}" -storepass ${storepassword} -keystore ${truststore} -noprompt rm $CERT done rm ${mydir}/global-bundle.pem echo "Trust store content is: " keytool -list -v -keystore "$truststore" -storepass ${storepassword} | grep Alias | cut -d " " -f3- | while read alias do expiry=`keytool -list -v -keystore "$truststore" -storepass ${storepassword} -alias "${alias}" | grep Valid | perl -ne 'if(/until: (.*?)\n/) { print "$1\n"; }'` echo " Certificate ${alias} expires in '$expiry'" done
macOS

下面是一个示例 Shell 脚本,它将证书捆绑包导入 macOS 上的信任存储。

mydir=tmp/certs if [ ! -e "${mydir}" ] then mkdir -p "${mydir}" fi truststore=${mydir}/rds-truststore.jks storepassword=changeit curl -sS "https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem" > ${mydir}/global-bundle.pem split -p "-----BEGIN CERTIFICATE-----" ${mydir}/global-bundle.pem rds-ca- for CERT in rds-ca-*; do alias=$(openssl x509 -noout -text -in $CERT | perl -ne 'next unless /Subject:/; s/.*(CN=|CN = )//; print') echo "Importing $alias" keytool -import -file ${CERT} -alias "${alias}" -storepass ${storepassword} -keystore ${truststore} -noprompt rm $CERT done rm ${mydir}/global-bundle.pem echo "Trust store content is: " keytool -list -v -keystore "$truststore" -storepass ${storepassword} | grep Alias | cut -d " " -f3- | while read alias do expiry=`keytool -list -v -keystore "$truststore" -storepass ${storepassword} -alias "${alias}" | grep Valid | perl -ne 'if(/until: (.*?)\n/) { print "$1\n"; }'` echo " Certificate ${alias} expires in '$expiry'" done