新しい SSL/TLS 証明書を使用して Oracle DB インスタンスに接続するようにアプリケーションを更新する
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」を参照してください。
アプリケーションが DB インスタンスに対して 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 接続を示します。ただし、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 ログの発行」を参照してください。
アプリケーション信頼ストアの更新
SSL/TLS 接続に SQL*Plus または JDBC を使用するアプリケーションの信頼ストアを更新できます。
SQL*Plus のアプリケーション信頼ストアの更新
SSL/TLS 接続に SQL*Plus を使用するアプリケーションの信頼ストアを更新できます。
信頼ストアを更新するとき、新しい証明書を追加できるだけでなく、古い証明書を保持できます。
SQL*Plus アプリケーションの信頼ストアを更新するには
-
すべての AWS リージョンで動作する 2019 ルート証明書をダウンロードし、そのファイルを
ssl_wallet
ディレクトリに置きます。ルート証明書のダウンロードについては、SSL/TLS を使用した DB インスタンスへの接続の暗号化 を参照してください。
-
以下のコマンドを実行して 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ファイル名を、ダウンロードしたファイル名に置き換えます。
-
次のコマンドを実行して、ウォレットが正しく更新されていることを確認します。
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 アプリケーションの信頼ストアを更新するには
-
すべての AWS リージョンで動作する 2019 ルート証明書をダウンロードし、そのファイルを ssl_wallet ディレクトリに置きます。
ルート証明書のダウンロードについては、SSL/TLS を使用した DB インスタンスへの接続の暗号化 を参照してください。
-
次のコマンドを使用して、証明書を .der 形式に変換します。
openssl x509 -outform der -in
rds-ca-2019-root.pem
-out rds-ca-2019-root.derファイル名を、ダウンロードしたファイル名に置き換えます。
-
次のコマンドを使用して、証明書をキーストアにインポートします。
keytool -import -alias rds-root -keystore
clientkeystore
-file rds-ca-2019-root.der -
キーストアが正常に更新されたことを確認します。
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 を参照してください。