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

更新应用程序以使用新的 SSL/TLS 证书连接到 Oracle 数据库实例

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

本主题可帮助您确定是否有任何客户端应用程序使用 SSL/TLS 连接到您的数据库实例。

重要

更改 Amazon RDS for Oracle 数据库实例的证书时,仅有数据库侦听器会重新启动。数据库实例不重新启动。现有数据库连接不受影响,但在重新启动侦听器时,新连接将在短时间内遇到错误。

注意

对于使用 SSL/TLS 连接到数据库实例的客户端应用程序,您必须更新客户端应用程序信任存储,以包括新的 CA 证书。

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

有关证书轮换的更多信息,请参阅轮换 SSL/TLS 证书。有关下载证书的更多信息,请参阅使用 SSL/TLS 加密与数据库实例的连接。有关对 Oracle 数据库实例使用 SSL/TLS 的信息,请参阅Oracle 安全套接字层

确定是否有任何应用程序使用 SSL 连接到 Oracle 数据库实例

如果 Oracle 数据库实例使用添加了 SSL 选项的选项组,则可能在使用 SSL。按照列出选项组的选项和选项设置中的说明进行检查。有关 SSL 选项的信息,请参阅 Oracle 安全套接字层

查看侦听器日志以确定是否存在 SSL 连接。下面是侦听器日志中的示例输出。

date time * (CONNECT_DATA=(CID=(PROGRAM=program) (HOST=host)(USER=user))(SID=sid)) * (ADDRESS=(PROTOCOL=tcps)(HOST=host)(PORT=port)) * establish * ORCL * 0

当一个条目的 PROTOCOL 具有 tcps 值时,这显示 SSL 连接。不过,当 HOST127.0.0.1 时,您可以忽略该条目。来自 127.0.0.1 的连接是数据库实例上的本地管理代理。这些连接不是外部 SSL 连接。因此,如果您看到 PROTOCOLtcpsHOST 不是 127.0.0.1 的侦听器日志条目,则您的应用程序使用 SSL 进行连接。

要查看侦听器日志,您可以将该日志发布到 Amazon CloudWatch Logs。有关更多信息,请参阅将 Oracle 日志发布到 Amazon CloudWatch Logs

更新应用程序信任存储

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

更新 SQL*Plus 应用程序信任存储

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

注意

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

更新 SQL*Plus 应用程序信任存储

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

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

  2. 运行以下命令以更新 Oracle wallet。

    prompt>orapki wallet add -wallet $ORACLE_HOME/ssl_wallet -trusted_cert -cert $ORACLE_HOME/ssl_wallet/rds-ca-2019-root.pem -auto_login_only

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

  3. 运行以下命令以确认已成功更新 wallet。

    prompt>orapki wallet display -wallet $ORACLE_HOME/ssl_wallet

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

    Trusted Certificates: Subject: CN=Amazon RDS Root 2019 CA,OU=Amazon RDS,O=Amazon Web Services\, Inc.,L=Seattle,ST=Washington,C=US

更新 JDBC 应用程序信任存储

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

更新 JDBC 应用程序信任存储

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

    有关下载根证书的信息,请参阅 使用 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 连接的示例 Java 代码

以下代码说明如何设置使用 JDBC 的 SSL 连接。

import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; public class OracleSslConnectionTest { private static final String DB_SERVER_NAME = "<dns-name-provided-by-amazon-rds>"; private static final Integer SSL_PORT = "<ssl-option-port-configured-in-option-group>"; private static final String DB_SID = "<oracle-sid>"; private static final String DB_USER = "<user name>"; private static final String DB_PASSWORD = "<password>"; // This key store has only the prod root ca. private static final String KEY_STORE_FILE_PATH = "<file-path-to-keystore>"; private static final String KEY_STORE_PASS = "<keystore-password>"; public static void main(String[] args) throws SQLException { final Properties properties = new Properties(); final String connectionString = String.format( "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=%s)(PORT=%d))(CONNECT_DATA=(SID=%s)))", DB_SERVER_NAME, SSL_PORT, DB_SID); properties.put("user", DB_USER); properties.put("password", DB_PASSWORD); properties.put("oracle.jdbc.J2EE13Compliant", "true"); properties.put("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH); properties.put("javax.net.ssl.trustStoreType", "JKS"); properties.put("javax.net.ssl.trustStorePassword", KEY_STORE_PASS); final Connection connection = DriverManager.getConnection(connectionString, properties); // If no exception, that means handshake has passed, and an SSL connection can be opened } }
重要

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