

# 使用新 SSL/TLS 证书更新应用程序，以连接到 Aurora PostgreSQL 数据库集群
<a name="ssl-certificate-rotation-aurora-postgresql"></a>

自 2023 年 1 月 13 日起，Amazon RDS 发布了新的证书颁发机构（CA）证书，以便使用安全套接字层或传输层安全性协议（SSL/TLS）连接到 Aurora 数据库集群。接下来，您可以找到有关更新应用程序以使用新证书的信息。

本主题可帮助您确定是否有任何客户端应用程序使用 SSL/TLS 连接到您的数据库集群。如果是这样，您可以进一步检查这些应用程序是否需要证书验证才能连接。

**注意**  
某些应用程序被配置为仅在它们可以成功验证服务器上的证书时才连接到 Aurora PostgreSQL 数据库集群。  
对于此类应用程序，您必须更新客户端应用程序信任存储，以包括新的 CA 证书。

更新客户端应用程序信任存储中的 CA 证书后，可以在数据库集群上轮换这些证书。强烈建议在生产环境中实现这些过程之前，先在开发或测试环境中测试它们。

有关证书轮换的更多信息，请参阅[轮换 SSL/TLS 证书](UsingWithRDS.SSL-certificate-rotation.md)。有关下载证书的更多信息，请参阅[使用 SSL/TLS 加密与数据库集群的连接](UsingWithRDS.SSL.md)。有关将 SSL/TLS 与 PostgreSQL 数据库集群配合使用的信息，请参阅[利用 SSL/TLS 保护 Aurora PostgreSQL 数据](AuroraPostgreSQL.Security.md#AuroraPostgreSQL.Security.SSL)。

**Topics**
+ [确定是否有应用程序正使用 SSL 连接到 Aurora PostgreSQL 数据库集群](#ssl-certificate-rotation-aurora-postgresql.determining-server)
+ [确定客户端是否需要证书验证才能连接](#ssl-certificate-rotation-aurora-postgresql.determining-client)
+ [更新应用程序信任存储](#ssl-certificate-rotation-aurora-postgresql.updating-trust-store)
+ [对不同类型的应用程序使用 SSL/TLS 连接](#ssl-certificate-rotation-aurora-postgresql.applications)

## 确定是否有应用程序正使用 SSL 连接到 Aurora PostgreSQL 数据库集群
<a name="ssl-certificate-rotation-aurora-postgresql.determining-server"></a>

检查数据库集群配置中 `rds.force_ssl` 参数的值。默认情况下，`rds.force_ssl` 参数设置为 `0`（关）。如果 `rds.force_ssl` 参数设置为 `1`（开），则客户端需要使用 SSL/TLS 进行连接。有关参数组的更多信息，请参阅 [Amazon Aurora 的参数组](USER_WorkingWithParamGroups.md)。

如果 `rds.force_ssl` 未设置为 `1`（开），则查询 `pg_stat_ssl` 视图以检查使用 SSL 的连接。例如，以下查询仅返回 SSL 连接和有关使用 SSL 的客户端的信息。

```
select datname, usename, ssl, client_addr from pg_stat_ssl inner join pg_stat_activity on pg_stat_ssl.pid = pg_stat_activity.pid where ssl is true and usename<>'rdsadmin';
```

只有使用 SSL/TLS 连接的行才显示有关连接的信息。下面是示例输出。

```
 datname  | usename | ssl | client_addr
----------+---------+-----+-------------
 benchdb  | pgadmin | t   | 53.95.6.13
 postgres | pgadmin | t   | 53.95.6.13
(2 rows)
```

上述查询仅显示进行查询时的有效连接。没有结果并不表示没有应用程序在使用 SSL 连接。其他 SSL 连接可能在不同的时间建立。

## 确定客户端是否需要证书验证才能连接
<a name="ssl-certificate-rotation-aurora-postgresql.determining-client"></a>

当客户端（如 psql 或 JDBC）配置有 SSL 支持时，默认情况下，该客户端会首先尝试使用 SSL 连接到数据库。如果该客户端无法使用 SSL 进行连接，它将恢复为不使用 SSL 进行连接。用于基于 libpq 的客户端（例如 psql）和 JDBC 的默认 `sslmode` 模式设置为 `prefer`。仅当提供 `sslrootcert` 且 `sslmode` 设置为 `verify-ca` 或 `verify-full` 时，才会验证服务器上的证书。如果证书无效，则会引发错误。

使用 `PGSSLROOTCERT` 验证具有 `PGSSLMODE` 环境变量的证书，且 `PGSSLMODE` 设置为 `verify-ca` 或 `verify-full`。

```
PGSSLMODE=verify-full PGSSLROOTCERT=/fullpath/ssl-cert.pem psql -h pgdbidentifier.cxxxxxxxx.us-east-2.rds.amazonaws.com -U primaryuser -d postgres
```

使用 `sslrootcert` 参数验证 `sslmode` 为连接字符串格式的证书，且 `sslmode` 设置为 `verify-ca` 或 `verify-full`。

```
psql "host=pgdbidentifier.cxxxxxxxx.us-east-2.rds.amazonaws.com sslmode=verify-full sslrootcert=/full/path/ssl-cert.pem user=primaryuser dbname=postgres"
```

例如，在上述情况下，如果您使用无效的根证书，则会在客户端上看到类似于以下内容的错误。

```
psql: SSL error: certificate verify failed
```

## 更新应用程序信任存储
<a name="ssl-certificate-rotation-aurora-postgresql.updating-trust-store"></a>

有关更新 PostgreSQL 应用程序的信任存储的信息，请参阅 PostgreSQL 文档中的[使用 SSL 保护 TCP/IP 连接](https://www.postgresql.org/docs/current/ssl-tcp.html)。

**注意**  
更新信任存储时，除了添加新证书外，还可以保留较旧证书。

### 更新 JDBC 应用程序信任存储
<a name="ssl-certificate-rotation-aurora-postgresql.updating-trust-store.jdbc"></a>

您可以更新使用 JDBC 的应用程序的信任存储以进行 SSL/TLS 连接。

有关下载根证书的信息，请参阅 [使用 SSL/TLS 加密与数据库集群的连接](UsingWithRDS.SSL.md)。

有关导入证书的示例脚本，请参阅 [将证书导入信任存储的示例脚本](UsingWithRDS.SSL-certificate-rotation.md#UsingWithRDS.SSL-certificate-rotation-sample-script)。

## 对不同类型的应用程序使用 SSL/TLS 连接
<a name="ssl-certificate-rotation-aurora-postgresql.applications"></a>

下面提供了有关对不同类型应用程序使用 SSL/TLS 连接的信息：
+ **psql**

  通过将选项指定为连接字符串或环境变量，可以从命令行调用客户端。对于 SSL/TLS 连接，相关选项为 `sslmode`（环境变量 `PGSSLMODE`）和 `sslrootcert`（环境变量 `PGSSLROOTCERT`）。

  有关完整的选项列表，请参阅 PostgreSQL 文档中的[参数关键字](https://www.postgresql.org/docs/11/libpq-connect.html#LIBPQ-PARAMKEYWORDS)。有关完整的环境变量列表，请参阅 PostgreSQL 文档中的[环境变量](https://www.postgresql.org/docs/current/libpq-envars.html)。
+ **pgAdmin**

  这个基于浏览器的客户端是一个更加用户友好的界面，用于连接到 PostgreSQL 数据库。

  有关配置连接的信息，请参阅 [pgAdmin 文档](https://www.pgadmin.org/docs/pgadmin4/latest/server_dialog.html)。
+ **JDBC**

  JDBC 支持与 Java 应用程序的数据库连接。

  有关使用 JDBC 连接到 PostgreSQL 数据库的一般信息，请参阅 PostgreSQL 文档中的[连接到数据库](https://jdbc.postgresql.org/documentation/use/)。有关使用 SSL/TLS 进行连接的信息，请参阅 PostgreSQL 文档中的[配置客户端](https://jdbc.postgresql.org/documentation/ssl/)。
+ **Python**

  一个常用的连接到 PostgreSQL 数据库的 Python 库是 `psycopg2`。

  有关如何使用 `psycopg2` 的信息，请参阅 [psycopg2 文档](https://pypi.org/project/psycopg2/)。有关如何连接到 PostgreSQL 数据库的简短教程，请参阅 [Psycopg2 教程](https://wiki.postgresql.org/wiki/Psycopg2_Tutorial)。您可以在 [psycopg2 模块内容](https://www.psycopg.org/docs/module.html)中找到有关连接命令接受的选项的信息。

**重要**  
在确定了数据库连接使用 SSL/TLS 并更新了应用程序信任存储之后，可以更新数据库以使用 rds-ca-rsa2048-g1 证书。有关说明，请参阅[通过修改数据库实例来更新 CA 证书](UsingWithRDS.SSL-certificate-rotation.md#UsingWithRDS.SSL-certificate-rotation-updating)中的步骤 3。