使用新 SSL/TLS 证书更新应用程序,以连接到 Aurora PostgreSQL 数据库集群 - Amazon Aurora
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用新 SSL/TLS 证书更新应用程序,以连接到 Aurora PostgreSQL 数据库集群

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

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

注意

某些应用程序被配置为仅在它们可以成功验证服务器上的证书时才连接到 Aurora PostgreSQL 数据库集群。

对于此类应用程序,您必须更新客户端应用程序信任存储,以包括新的 CA 证书。

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

有关证书轮换的更多信息,请参阅轮换 SSL/TLS 证书。有关下载证书的更多信息,请参阅使用 SSL/TLS 加密与数据库集群的连接。有关将 SSL/TLS 与 PostgreSQL 数据库集群配合使用的信息,请参阅利用 SSL 保护 Aurora PostgreSQL 数据

确定是否有应用程序正使用 SSL 连接到 Aurora PostgreSQL 数据库集群

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

如果 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 连接可能在不同的时间建立。

确定客户端是否需要证书验证才能连接

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

使用 PGSSLROOTCERT 验证具有 PGSSLMODE 环境变量的证书,将 PGSSLMODE 设置为 requireverify-caverify-full

PGSSLMODE=require PGSSLROOTCERT=/fullpath/rds-ca-2019-root.pem psql -h pgdbidentifier.cxxxxxxxx.us-east-2.rds.amazonaws.com -U masteruser -d postgres

使用 sslrootcert 参数验证 sslmode 为连接字符串格式的证书,将 sslmode 设置为 requireverify-caverify-full

psql "host=pgdbidentifier.cxxxxxxxx.us-east-2.rds.amazonaws.com sslmode=require sslrootcert=/full/path/rds-ca-2019-root.pem user=masteruser dbname=postgres"

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

psql: SSL error: certificate verify failed

更新应用程序信任存储

有关更新 PostgreSQL 应用程序的信任存储的信息,请参阅 PostgreSQL 文档中的使用 SSL 保护 TCP/IP 连接

注意

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

更新 JDBC 应用程序信任存储

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

更新 JDBC 应用程序信任存储

  1. 下载适用于所有 AWS 区域的 2019 年根证书,并将此文件放在信任存储目录中。

    有关下载根证书的信息,请参阅 使用 SSL/TLS 加密与数据库集群的连接

  2. 使用以下命令将证书转换为 .der 格式。

    openssl x509 -outform der -in rds-ca-2019-root.pem -out rds-ca-2019-root.der

    将文件名替换为您下载的文件名。

  3. 使用以下命令将证书导入密钥存储。

    keytool -import -alias rds-root -keystore clientkeystore -file rds-ca-2019-root.der
  4. 确认成功更新了密钥存储。

    keytool -list -v -keystore clientkeystore.jks

    在出现提示时,输入密钥存储密码。

    您的输出应包含以下内容。

    rds-root,date, trustedCertEntry, Certificate fingerprint (SHA1): D4:0D:DB:29:E3:75:0D:FF:A6:71:C3:14:0B:BF:5F:47:8D:1C:80:96 # This fingerprint should match the output from the below command openssl x509 -fingerprint -in rds-ca-2019-root.pem -noout

对不同类型的应用程序使用 SSL/TLS 连接

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

  • psql

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

    有关完整的选项列表,请参阅 PostgreSQL 文档中的参数关键字。有关完整的环境变量列表,请参阅 PostgreSQL 文档中的环境变量

  • pgAdmin

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

    有关配置连接的信息,请参阅 pgAdmin 文档

  • JDBC

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

    有关使用 JDBC 连接到 PostgreSQL 数据库的一般信息,请参阅 PostgreSQL 文档中的连接到数据库。有关使用 SSL/TLS 进行连接的信息,请参阅 PostgreSQL 文档中的配置客户端

  • Python

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

    有关如何使用 psycopg2 的信息,请参阅 psycopg2 文档。有关如何连接到 PostgreSQL 数据库的简短教程,请参阅 Psycopg2 教程。您可以在 psycopg2 模块内容中找到有关连接命令接受的选项的信息。

重要

在确定了数据库连接使用 SSL/TLS 并更新了应用程序信任存储之后,可以更新数据库以使用 rds-ca-2019 证书。有关说明,请参阅通过修改数据库实例来更新 CA 证书中的步骤 3。