

# 轮换 SSL/TLS 证书
<a name="UsingWithRDS.SSL-certificate-rotation"></a>

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 加密与数据库实例或集群的连接](UsingWithRDS.SSL.md)。

要更新数据库的 CA 证书，请使用以下方法：
+  [通过修改数据库实例或集群来更新 CA 证书](#UsingWithRDS.SSL-certificate-rotation-updating) 
+  [通过应用维护来更新 CA 证书](#UsingWithRDS.SSL-certificate-rotation-maintenance-update) 

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

## 轮换证书的注意事项
<a name="UsingWithRDS.SSL-certificate-rotation-considerations"></a>

在轮换证书之前，请考虑以下情况：
+ Amazon RDS 代理使用来自 AWS Certificate Manager（ACM）的证书。如果您使用的是 RDS 代理，当您轮换 SSL/TLS 证书时，您不需要更新使用 RDS 代理连接的应用程序。有关更多信息，请参阅 [将 TLS/SSL 与 RDS 代理结合使用](rds-proxy.howitworks.md#rds-proxy-security.tls)。
+ 如果您将 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 问题 \$139568](https://github.com/golang/go/issues/39568)。

## 通过修改数据库实例或集群来更新 CA 证书
<a name="UsingWithRDS.SSL-certificate-rotation-updating"></a>

以下示例将您的 CA 证书从 *rds-ca-2019* 更新为 *rds-ca-rsa2048-g1*。您可以选择其他证书。有关更多信息，请参阅 [证书颁发机构](UsingWithRDS.SSL.md#UsingWithRDS.SSL.RegionCertificateAuthorities)。

更新您的应用程序信任存储，以减少任何与更新 CA 证书相关的停机时间。有关与 CA 证书轮换相关的重启的更多信息，请参阅[自动服务器证书轮换](#UsingWithRDS.SSL-certificate-rotation-server-cert-rotation)。

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

1. 下载新的 SSL/TLS 证书，如[使用 SSL/TLS 加密与数据库实例或集群的连接](UsingWithRDS.SSL.md)中所述。

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

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

   有关检查 SSL/TLS 连接和更新每个数据库引擎的应用程序的信息，请参阅以下主题：
   +  [更新应用程序以使用新的 SSL/TLS 证书连接到 MariaDB 实例](ssl-certificate-rotation-mariadb.md) 
   +  [更新应用程序以使用新的 SSL/TLS 证书连接到 Microsoft SQL Server 数据库实例](ssl-certificate-rotation-sqlserver.md) 
   +  [更新应用程序以使用新的 SSL/TLS 证书连接到 MySQL 数据库实例](ssl-certificate-rotation-mysql.md) 
   +  [更新应用程序以使用新的 SSL/TLS 证书连接到 Oracle 数据库实例](ssl-certificate-rotation-oracle.md) 
   +  [更新应用程序以使用新的 SSL/TLS 证书连接到 PostgreSQL 数据库实例](ssl-certificate-rotation-postgresql.md) 

   有关更新 Linux 操作系统信任存储的示例脚本，请参阅[将证书导入信任存储的示例脚本](#UsingWithRDS.SSL-certificate-rotation-sample-script)。
**注意**  
证书捆绑包包含新旧 CA 证书，因此您可以安全地升级应用程序并在转换期间保持连接。如果您正在使用 AWS Database Migration Service 将数据库迁移到数据库实例或集群，我们建议您使用证书捆绑包来确保迁移期间的连接性。

1. 修改数据库实例或多可用区数据库集群，以便将 CA 从 **rds-ca-2019** 更改为 **rds-ca-rsa2048-g1**。要检查您的数据库是否需要重启才能更新 CA 证书，请使用 [describe-db-engine-versions](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-engine-versions.html) 命令并检查 `SupportsCertificateRotationWithoutRestart` 标志。
**重要**  
如果您在证书到期后遇到连接问题，请通过在控制台中指定 **Apply immediately (立即应用)** 或者 使用 `--apply-immediately` 指定 AWS CLI 选项来使用“立即应用”选项。默认情况下，此操作安排在您的下个维护时段运行。  
对于 RDS for Oracle 数据库实例，建议您重新启动 Oracle 数据库以防止出现任何连接错误。  
对于启用了 AlwaysOn 或镜像选项的 RDS for SQL Server 多可用区实例，在证书轮换后重启实例时，预计会进行失效转移。  
要为与默认 RDS CA 不同的实例 CA 设置覆盖，请使用 [modify-certificates](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-certificates.html) CLI 命令。

您可以使用 AWS 管理控制台或 AWS CLI，对于数据库实例或多可用区数据库集群，将 CA 证书从 **rds-ca-2019** 更改为 **rds-ca-rsa2048-g1**。

------
#### [ Console ]

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

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

1. 选择 **Modify**(修改)。  
![\[修改数据库实例或多可用区数据库集群\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/ssl-rotate-cert-modify.png)

1. 在**连接**部分中，选择 **rds-ca-rsa2048-g1**。  
![\[选择 CA 证书\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/ssl-rotate-cert-ca-rsa2048-g1.png)

1. 选择**继续**，查看修改摘要。

1. 要立即应用更改，请选择**立即应用**。

1. 在确认页面上，检查您的更改。如果更改正确无误，请选择**修改数据库实例**或**修改集群**以保存更改。
**重要**  
安排此操作时，请确保已预先更新客户端信任存储。

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

------
#### [ AWS CLI ]

要使用 AWS CLI 将数据库实例或多可用区数据库集群的 CA 从 **rds-ca-2019** 更改为 **rds-ca-rsa2048-g1**，请调用 [modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) 或 [modify-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster.html) 命令。指定数据库实例或集群标识符和 `--ca-certificate-identifier` 选项。

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

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

**Example**  
 **数据库实例**   
以下示例通过将 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](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) CLI 命令并指定 `--no-certificate-rotation-restart` 选项。

**Example**  
 **多可用区数据库集群**   
以下示例通过将 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 证书
<a name="UsingWithRDS.SSL-certificate-rotation-maintenance-update"></a>

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

------
#### [ Console ]

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

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**证书更新**。  
![\[证书轮换导航窗格选项\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/ssl-rotate-cert-certupdate.png)

   将显示**需要更新证书的数据库**页面。  
![\[更新数据库的 CA 证书\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/ssl-rotate-cert-update-multiple.png)
**注意**  
该页面仅显示当前 AWS 区域的数据库实例和集群。如果您在多个 AWS 区域中有数据库，请检查每个 AWS 区域中的该页面，以查看具有旧 SSL/TLS 证书的所有数据库实例。

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

   您可以通过选择**计划**来计划下一维护时段的证书轮换。通过选择**立即应用**来立即应用轮换。
**重要**  
如果您在证书到期后遇到连接问题，请使用**立即应用**选项。

1. 

   1. 如果您选择**计划**，系统会提示您确认 CA 证书轮换。此提示还说明更新的计划时段。  
![\[确认证书轮换\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/ssl-rotate-cert-confirm-schedule.png)

   1. 如果您选择**立即应用**，系统会提示您确认 CA 证书轮换。  
![\[确认证书轮换\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/ssl-rotate-cert-confirm-now.png)
**重要**  
在计划数据库上的 CA 证书轮换之前，请更新使用 SSL/TLS 和服务器证书进行连接的所有客户端应用程序。这些更新特定于您的数据库引擎。更新这些客户端应用程序后，可以确认 CA 证书轮换。

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

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

------

## 自动服务器证书轮换
<a name="UsingWithRDS.SSL-certificate-rotation-server-cert-rotation"></a>

如果根 CA 支持自动服务器证书轮换，RDS 会自动处理数据库服务器证书的轮换。RDS 使用相同的根 CA 进行自动轮换，因此您无需下载新的 CA 服务包。请参阅[证书颁发机构](UsingWithRDS.SSL.md#UsingWithRDS.SSL.RegionCertificateAuthorities)。

数据库服务器证书的轮换和有效期取决于您的数据库引擎：
+ 如果您的数据库引擎支持无需重启即可轮换，则 RDS 会自动轮换数据库服务器证书，而无需您执行任何操作。RDS 尝试在您首选的维护时段中，在数据库服务器证书的半生命周期轮换您的数据库服务器证书。新的数据库服务器证书的有效期为 12 个月。
+ 如果您的数据库引擎不支持无需重启的证书轮换，Amazon RDS 会在证书有效期过半时或至少在到期前 3 个月，通过 Describe-pending-maintenance-actions API 显示 `server-certificate-rotation` 待处理的维护操作。您可以使用 apply-pending-maintenance-action API 来应用轮换。新的数据库服务器证书的有效期为 36 个月。

使用 [describe-db-engine-versions](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-engine-versions.html) 命令并检查 `SupportsCertificateRotationWithoutRestart`标志，以确定数据库引擎版本是否支持无需重启即可轮换证书。有关更多信息，请参阅 [为数据库设置 CA](UsingWithRDS.SSL.md#UsingWithRDS.SSL.RegionCertificateAuthorities.Selection)。

## 将证书导入信任存储的示例脚本
<a name="UsingWithRDS.SSL-certificate-rotation-sample-script"></a>

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

每个示例 Shell 脚本都使用 keytool，它是 Java 开发工具包 (JDK) 的一部分。有关安装 JDK 的信息，请参阅 [JDK 安装指南](https://docs.oracle.com/en/java/javase/17/install/overview-jdk-installation.html)。

------
#### [ 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
```

------