新しい SSL/TLS 証明書を使用するためのアプリケーションの更新 - Amazon Relational Database Service

新しい SSL/TLS 証明書を使用するためのアプリケーションの更新

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

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

重要

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

注記

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

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

証明書のローテーションの詳細については、「SSL/TLS 証明書のローテーション」を参照してください。証明書のダウンロードの詳細については、SSL/TLS を使用した DB インスタンスへの接続の暗号化 を参照してください。Oracle DB インスタンスで SSL/TLS を使用する方法については、「Oracle Secure Sockets Layer」を参照してください。

アプリケーションが SSL を使用して接続しているかどうかを調べる

Oracle DB インスタンスで SSL オプションが追加されたオプショングループを使用する場合、SSL を使用している可能性があります。オプショングループのオプションとオプション設定をリスト化する の手順に従ってこれをチェックします。SSL オプションの詳細については、「Oracle Secure Sockets Layer」を参照してください。

リスナーログをチェックして、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 からの接続は、DB インスタンス上のローカル管理エージェントです。これらの接続は外部 SSL 接続ではありません。そのため、PROTOCOLtcps であり、HOST127.0.0.1 ではないリスナーログエントリがある場合、SSL を使用して接続しているアプリケーションがあります。

リスナーログをチェックするには、ログを Amazon CloudWatch Logs に発行します。詳細については、「Amazon CloudWatch Logs への Oracle ログの発行」を参照してください。

アプリケーション信頼ストアの更新

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

SQL*Plus のアプリケーション信頼ストアの更新

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

注記

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

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

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

    ルート証明書のダウンロードについては、SSL/TLS を使用した DB インスタンスへの接続の暗号化 を参照してください。

  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. 次のコマンドを実行して、ウォレットが正しく更新されていることを確認します。

    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 のアプリケーション信頼ストアの更新

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

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

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

    ルート証明書のダウンロードについては、SSL/TLS を使用した DB インスタンスへの接続の暗号化 を参照してください。

  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 証明書を使用するようにデータベースを更新できます。手順については、「DB インスタンスの変更による CA 証明書の更新」のステップ 3 を参照してください。