Atualizar aplicações para conexão com instâncias de banco de dados MariaDB usando novos certificados SSL/TLS - Amazon Relational Database Service

Atualizar aplicações para conexão com instâncias de banco de dados MariaDB usando novos certificados SSL/TLS

Em 19 de setembro de 2019, o Amazon RDS publicou novos certificados de autoridade de certificação (CA) para conectar-se às suas instâncias de banco de dados do RDS via SSL (Secure Socket Layer) ou TLS (Transport Layer Security). A seguir, você pode encontrar informações sobre como atualizar seus aplicativos para usar os novos certificados.

Este tópico pode ajudá-lo a determinar se seus aplicativos exigem verificação do certificado para se conectar às suas instâncias de bancos de dados.

nota

Alguns aplicativos são configurados para se conectar ao MariaDB apenas quando podem verificar com sucesso o certificado no servidor. Para esses aplicativos, você deve atualizar os repositórios confiáveis de aplicativos cliente para incluir os novos certificados de CA.

É possível especificar os seguintes modos SSL: disabled, preferred e required. Quando você usa o modo SSL preferred e o certificado CA não existe ou não está atualizado, o seguinte comportamento se aplica:

  • Para MariaDB versão 10.2 e posterior e as versões secundárias mais recentes de 10.0 e 10.1, a conexão volta a não usar SSL e ainda se conecta com êxito.

    Como essas versões posteriores usam o protocolo OpenSSL, um certificado de servidor expirado não impede conexões bem-sucedidas, a menos que o modo SSL required seja especificado.

  • Para as versões secundárias MariaDB 10.0 e 10.1 mais antigas, é retornado um erro.

    Como essas versões mais antigas usam o protocolo yaSSL, a verificação de certificado é estritamente aplicada e a conexão não tem êxito.

    As seguintes versões secundárias do MariaDB usam o protocolo yaSSL:

    • 10.0.17, 10.0.24, 10.0.28, 10.0.31, 10.0.32

    • 10.1.14, 10.1.19, 10.1.23, 10.1.26

Depois de atualizar seus certificados de CA nos armazenamentos confiáveis do aplicativo cliente, você pode fazer o rodízio dos certificados nas suas instâncias de banco de dados. É altamente recomendável testar esses procedimentos em um ambiente de desenvolvimento ou teste antes de implementá-los em seus ambientes de produção.

Para obter mais informações sobre a mudança de certificados, consulte Alternar o certificado SSL/TLS. Para obter mais informações sobre como fazer download de certificados, consulte Usar o SSL/TLS para criptografar uma conexão com uma instância de banco de dados. Para obter informações sobre o uso de SSL/TLS com instâncias de bancos de dados MariaDB, consulte Uso do SSL com uma instância de banco de dados MariaDB.

Determinar se um cliente requer verificação de certificado para se conectar

É possível verificar se os clientes JDBC e MySQL exigem verificação de certificado para se conectarem.

JDBC

O exemplo a seguir com o MySQL Connector/J 8.0 mostra uma maneira de verificar as propriedades da conexão JDBC de um aplicativo para determinar se conexões bem-sucedidas exigem um certificado válido. Para obter mais informações sobre todas as opções de conexão JDBC para MySQL, consulte Propriedades da configuração na documentação do MySQL.

Ao usar o MySQL Connector/J 8.0, uma conexão SSL exigirá verificação com base no certificado de CA de servidor se as propriedades da sua conexão tiverem sslMode definido como VERIFY_CA ou VERIFY_IDENTITY, como no exemplo a seguir.

Properties properties = new Properties(); properties.setProperty("sslMode", "VERIFY_IDENTITY"); properties.put("user", DB_USER); properties.put("password", DB_PASSWORD);
nota

Se você usar o MySQL Java Connector v5.1.38 ou posterior, ou o MySQL Java Connector v8.0.9 ou posterior para se conectar a seus bancos de dados, mesmo que você não tenha configurado explicitamente seus aplicativos para usar SSL/TLS ao se conectar a seus bancos de dados, esses drivers cliente usam SSL/TLS como padrão. Além disso, ao usar SSL/TLS, eles executam a verificação parcial do certificado e haverá falha na conexão se o certificado do servidor de banco de dados tiver expirado.

MySQL

Os exemplos a seguir com o cliente MySQL mostram duas maneiras de verificar a conexão MySQL de um script para determinar se conexões bem-sucedidas exigem um certificado válido. Para obter mais informações sobre todas as opções de conexão com o cliente MySQL, consulte Configuração no lado do cliente para conexões criptografadas na documentação do MySQL.

Ao usar o Cliente MySQL 5.7 ou MySQL 8.0, uma conexão SSL requer verificação com base no certificado de CA de servidor se, para a opção --ssl-mode, você especificar VERIFY_CA ou VERIFY_IDENTITY, como no exemplo a seguir.

mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/ssl-cert.pem --ssl-mode=VERIFY_CA

Ao usar o Cliente MySQL 5.6, uma conexão SSL exigirá verificação com base no certificado de CA de servidor se você especificar a opção --ssl-verify-server-cert, como no exemplo a seguir.

mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/ssl-cert.pem --ssl-verify-server-cert

Atualizar o armazenamento confiável de aplicações

Para obter informações sobre como atualizar o repositório confiável para aplicativos MySQL, consulte o tópico sobre como Usar o TLS/SSL com MariaDB Connector/J, na documentação do MariaDB.

nota

Ao atualizar o armazenamento confiável, é possível reter certificados mais antigos, além de adicionar os novos certificados.

Atualizar o armazenamento confiável de aplicações para JDBC

Você pode atualizar o armazenamento confiável para aplicativos que usam conexões JDBC para SSL/TLS.

Como atualizar o armazenamento confiável para aplicativos JDBC

  1. Faça download do certificado raiz de 2019 que funcione para todas as regiões da AWS e coloque o arquivo no diretório do armazenamento confiável.

    Para obter informações sobre como fazer download do certificado raiz, consulte Usar o SSL/TLS para criptografar uma conexão com uma instância de banco de dados.

  2. Converta o certificado para o formato .der usando o seguinte comando.

    openssl x509 -outform der -in rds-ca-2019-root.pem -out rds-ca-2019-root.der

    Substitua o nome do arquivo pelo arquivo obtido por download.

  3. Importe o certificado para o repositório de chaves usando o seguinte comando.

    keytool -import -alias rds-root -keystore clientkeystore -file rds-ca-2019-root.der
  4. Confirme se o armazenamento de chaves foi atualizado com êxito.

    keytool -list -v -keystore clientkeystore.jks

    Insira a senha do repositório de chaves quando solicitado.

    Sua saída deve conter o seguinte.

    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

Se você estiver usando o driver JDBC MariaDB Connector/J em um aplicativo, defina as seguintes propriedades nesse aplicativo.

System.setProperty("javax.net.ssl.trustStore", certs); System.setProperty("javax.net.ssl.trustStorePassword", "password");

Ao iniciar o aplicativo, defina as seguintes propriedades.

java -Djavax.net.ssl.trustStore=/path_to_truststore/MyTruststore.jks -Djavax.net.ssl.trustStorePassword=my_truststore_password com.companyName.MyApplication

Exemplo de código Java para estabelecer conexões SSL

O exemplo de código a seguir mostra como configurar a conexão SSL usando o JDBC.

private static final String DB_USER = "admin"; 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 Exception { Class.forName("org.mariadb.jdbc.Driver"); System.setProperty("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH); System.setProperty("javax.net.ssl.trustStorePassword", KEY_STORE_PASS); Properties properties = new Properties(); properties.put("user", DB_USER); properties.put("password", DB_PASSWORD); Connection connection = DriverManager.getConnection("jdbc:mysql://ssl-mariadb-public.cni62e2e7kwh.us-east-1.rds.amazonaws.com:3306?useSSL=true",properties); Statement stmt=connection.createStatement(); ResultSet rs=stmt.executeQuery("SELECT 1 from dual"); return; }
Importante

Depois de determinar que as suas conexões com o banco de dados usam SSL/TLS e ter atualizado o armazenamento confiável de aplicativos, você poderá atualizar seu banco de dados para usar os certificados rds-ca-2019. Para obter instruções, consulte a etapa 3 em Atualizar o certificado CA modificando sua instância de banco de dados.