

# 更新应用程序以使用新的 SSL/TLS 证书连接到 Oracle 数据库实例
<a name="ssl-certificate-rotation-oracle"></a>

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

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

**重要**  
更改 Amazon RDS for Oracle 数据库实例的证书时，仅有数据库侦听器会重新启动。数据库实例不重新启动。现有数据库连接不受影响，但在重新启动侦听器时，新连接将在短时间内遇到错误。  
我们建议您重新启动 Oracle 数据库，以防止出现任何连接错误。

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

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

有关证书轮换的更多信息，请参阅[轮换 SSL/TLS 证书](UsingWithRDS.SSL-certificate-rotation.md)。有关下载证书的更多信息，请参阅[使用 SSL/TLS 加密与数据库实例或集群的连接](UsingWithRDS.SSL.md)。有关对 Oracle 数据库实例使用 SSL/TLS 的信息，请参阅[Oracle 安全套接字层](Appendix.Oracle.Options.SSL.md)。

**Topics**
+ [确认应用程序是否使用 SSL 进行连接](#ssl-certificate-rotation-oracle.determining)
+ [更新应用程序信任存储](#ssl-certificate-rotation-oracle.updating-trust-store)
+ [用于建立 SSL 连接的示例 Java 代码](#ssl-certificate-rotation-oracle.java-example)

## 确认应用程序是否使用 SSL 进行连接
<a name="ssl-certificate-rotation-oracle.determining"></a>

如果 Oracle 数据库实例使用添加了 `SSL` 选项的选项组，则可能在使用 SSL。按照[列出选项组的选项和选项设置](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.ListOption)中的说明进行检查。有关 `SSL` 选项的信息，请参阅 [Oracle 安全套接字层](Appendix.Oracle.Options.SSL.md)。

查看侦听器日志以确定是否存在 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 连接。不过，当 `HOST` 为 `127.0.0.1` 时，您可以忽略该条目。来自 `127.0.0.1` 的连接是数据库实例上的本地管理代理。这些连接不是外部 SSL 连接。因此，如果您看到 `PROTOCOL` 为 `tcps` 而 `HOST` *不是* `127.0.0.1` 的侦听器日志条目，则您的应用程序使用 SSL 进行连接。

要查看侦听器日志，您可以将该日志发布到 Amazon CloudWatch Logs。有关更多信息，请参阅“[将 Oracle 日志发布到 Amazon CloudWatch Logs](USER_LogAccess.Concepts.Oracle.md#USER_LogAccess.Oracle.PublishtoCloudWatchLogs)”。

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

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

### 更新 SQL\$1Plus 应用程序信任存储
<a name="ssl-certificate-rotation-oracle.updating-trust-store.sqlplus"></a>

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

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

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

1. 下载适用于所有 Amazon 区域的新的根证书，并将此文件放在 `ssl_wallet` 目录中。

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

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

   ```
   prompt>orapki wallet add -wallet $ORACLE_HOME/ssl_wallet -trusted_cert -cert
         $ORACLE_HOME/ssl_wallet/ssl-cert.pem -auto_login_only
   ```

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

1. 运行以下命令以确认已成功更新 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 应用程序信任存储
<a name="ssl-certificate-rotation-oracle.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 连接的示例 Java 代码
<a name="ssl-certificate-rotation-oracle.java-example"></a>

以下代码说明如何设置使用 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-rsa2048-g1 证书。有关说明，请参阅[通过修改数据库实例或集群来更新 CA 证书](UsingWithRDS.SSL-certificate-rotation.md#UsingWithRDS.SSL-certificate-rotation-updating)中的步骤 3。