

# 新しい SSL/TLS 証明書を使用して Oracle DB インスタンスに接続するようにアプリケーションを更新する
<a name="ssl-certificate-rotation-oracle"></a>

2023 年 1 月 13 日に Amazon RDS は、Secure Socket Layer または Transport Layer Security (SSL/TLS) を使用して RDS DB インスタンスに接続するための新しい認証局 (CA) 証明書を公開しました。ここでは、新しい証明書を使用するためのアプリケーションの更新について説明します。

このトピックでは、クライアントアプリケーションが SSL/TLS を使用して DB インスタンスに接続されているかどうかを判断できます。

**重要**  
Amazon RDS for Oracle DB インスタンスの証明書を変更すると、データベースリスナーのみが再起動されます。DB インスタンスは再起動されません。既存のデータベース接続は影響を受けませんが、新しい接続ではリスナーが再起動されるまで短期間だけエラーが発生します。  
接続エラーを防ぐために Oracle DB を再起動することをお勧めします。

**注記**  
DB インスタンスに接続するために SSL/TLS を使用するクライアントアプリケーションの場合、新しい CA 証明書を含めるためにクライアントアプリケーション信頼ストアを更新する必要があります。

クライアントアプリケーションの信頼ストアで CA 証明書を更新した後、DB インスタンスで証明書をローテーションできます。これらの手順を開発環境またはステージング環境でテストしてから、本番環境で実装することを強くお勧めします。

証明書のローテーションの詳細については、「[SSL/TLS 証明書のローテーション](UsingWithRDS.SSL-certificate-rotation.md)」を参照してください。証明書のダウンロードの詳細については、[SSL/TLS を使用した DB インスタンスまたはクラスターへの接続の暗号化](UsingWithRDS.SSL.md) を参照してください。Oracle DB インスタンスで SSL/TLS を使用する方法については、「[Oracle Secure Sockets Layer](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 DB インスタンスで `SSL` オプションが追加されたオプショングループを使用する場合、SSL を使用している可能性があります。[オプショングループのオプションとオプション設定をリスト化する](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.ListOption) の手順に従ってこれをチェックします。`SSL` オプションの詳細については、「[Oracle Secure Sockets Layer](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` からの接続は、DB インスタンス上のローカル管理エージェントです。これらの接続は外部 SSL 接続ではありません。そのため、`PROTOCOL` が `tcps` であり、`HOST` が `127.0.0.1` *ではない*リスナーログエントリがある場合、SSL を使用して接続しているアプリケーションがあります。

リスナーログをチェックするには、ログを Amazon CloudWatch Logs に発行します。詳細については、「[Amazon CloudWatch Logs への Oracle ログの発行](USER_LogAccess.Concepts.Oracle.md#USER_LogAccess.Oracle.PublishtoCloudWatchLogs)」を参照してください。

## アプリケーション信頼ストアの更新
<a name="ssl-certificate-rotation-oracle.updating-trust-store"></a>

SSL/TLS 接続に SQL\*Plus または JDBC を使用するアプリケーションの信頼ストアを更新できます。

### SQL\*Plus のアプリケーション信頼ストアの更新
<a name="ssl-certificate-rotation-oracle.updating-trust-store.sqlplus"></a>

SSL/TLS 接続に SQL\*Plus を使用するアプリケーションの信頼ストアを更新できます。

**注記**  
信頼ストアを更新するとき、新しい証明書を追加できるだけでなく、古い証明書を保持できます。

**SQL\*Plus アプリケーションの信頼ストアを更新するには**

1. すべての AWS リージョンで動作する新しいルート証明書をダウンロードし、そのファイルを `ssl_wallet` ディレクトリに置きます。

   ルート証明書のダウンロードについては、[SSL/TLS を使用した DB インスタンスまたはクラスターへの接続の暗号化](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. 次のコマンドを実行して、ウォレットが正しく更新されていることを確認します。

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

SSL/TLS 接続に JDBC を使用するアプリケーションの信頼ストアを更新できます。

ルート証明書のダウンロードについては、[SSL/TLS を使用した DB インスタンスまたはクラスターへの接続の暗号化](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 証明書を使用するようにデータベースを更新できます。ステップについては、「[DB インスタンスまたはクラスターの変更による CA 証明書の更新](UsingWithRDS.SSL-certificate-rotation.md#UsingWithRDS.SSL-certificate-rotation-updating)」のステップ 3 を参照してください。