Configurar uma conexão SSL via JDBC
Para usar uma conexão SSL via JDBC, é necessário criar um repositório de chaves, confiar no certificado da CA raiz do Amazon RDS e usar o trecho de código especificado a seguir.
Para criar o repositório de chaves no formato JKS, é possível usar o comando a seguir. Para ter mais informações sobre como criar o repositório de chaves, consulte Creating a keystore
keytool -genkey -alias
client
-validity365
-keyalgRSA
-keystoreclientkeystore
Siga estas etapas para confiar no certificado da CA raiz do Amazon RDS.
Para confiar no certificado da CA raiz do Amazon RDS
-
Baixe o pacote do certificado .pem que funciona para todas as Regiões da AWS e coloque o arquivo no diretório ssl_wallet.
Para obter informações sobre como baixar certificados, consulte Usar SSL/TLS para criptografar uma conexão com uma instância ou um cluster de banco de dados.
-
Extraia cada certificado no arquivo .pem em um arquivo separado usando um utilitário do sistema operacional.
-
Converta cada certificado no formato .der usando um comando
openssl
separado, substituindocertificate-pem-file
pelo nome do arquivo .pem do certificado (sem a extensão .pem).openssl x509 -outform der -in
certificate-pem-file
.pem -outcertificate-pem-file
.der -
Importe cada certificado para o repositório de chaves usando o comando a seguir.
keytool -import -alias rds-root -keystore
clientkeystore.jks
-filecertificate-pem-file
.derPara ter mais informações, consulte Alternar o certificado SSL/TLS.
-
Confirme se o armazenamento de chaves foi criado com êxito.
keytool -list -v -keystore
clientkeystore.jks
Insira a senha do repositório de chaves quando solicitado.
O exemplo de código a seguir mostra como configurar a conexão SSL usando o JDBC.
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 } }
nota
Especifique uma senha diferente do prompt mostrado aqui como prática recomendada de segurança.