Atualizar aplicações para conexão com instâncias de banco de dados MySQL usando novos certificados SSL/TLS
Em 13 de janeiro de 2023, o Amazon RDS publicou novos certificados de autoridade de certificação (CA) para se conectar às suas instâncias de banco de dados do RDS via Secure Socket Layer ou Transport Layer Security (SSL/TLS). 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 algum aplicativo cliente usa SSL/TLS para conectar-se às suas instâncias de banco de dados. Em caso positivo, examine mais a fundo se esse aplicativo exige verificação de certificado para se conectar.
nota
Alguns aplicativos são configurados para se conectar a instâncias de banco de dados MySQL 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
. Ao usar o modo preferred
do SSL, e o certificado de CA não existe ou não está atualizado, a conexão volta a não usar SSL e 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.
Recomendamos evitar o modo preferred
No modo preferred
, se a conexão encontrar um certificado inválido, ele para de usar criptografia e continua sem criptografia.
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 SSL/TLS para criptografar uma conexão com uma instância ou um cluster de banco de dados. Para obter informações sobre o uso de SSL/TLS com instâncias de bancos de dados MySQL, consulte Suporte do SSL/TLS para instâncias de banco de dados do MySQL no Amazon RDS.
Tópicos
Determinar se alguma aplicação está se conectando à instância de banco de dados MySQL usando SSL
Se você estiver usando o Amazon RDS para MySQL versão 5.7 ou 8.0 e o Esquema de desempenho estiver habilitado, execute a seguinte consulta para verificar se as conexões estão usando SSL/TLS. Para obter informações sobre como habilitar o Esquema de performance, consulte Performance Schema quick start
mysql> SELECT id, user, host, connection_type FROM performance_schema.threads pst INNER JOIN information_schema.processlist isp ON pst.processlist_id = isp.id;
Nesta saída de exemplo, é possível ver que a sua própria sessão (admin
) e um aplicativo conectado como webapp1
estão usando SSL.
+----+-----------------+------------------+-----------------+ | id | user | host | connection_type | +----+-----------------+------------------+-----------------+ | 8 | admin | 10.0.4.249:42590 | SSL/TLS | | 4 | event_scheduler | localhost | NULL | | 10 | webapp1 | 159.28.1.1:42189 | SSL/TLS | +----+-----------------+------------------+-----------------+ 3 rows in set (0.00 sec)
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
Ao usar o MySQL Connector/J 8.0, uma conexão SSL exigirá verificação com base no certificado do servidor de banco de dados 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
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 armazenamento confiável para aplicações MySQL, consulte Installing SSL certificates
Para obter informações sobre como baixar o certificado raiz, consulte Usar SSL/TLS para criptografar uma conexão com uma instância ou um cluster de banco de dados.
Para obter exemplos de scripts que importam certificados, consulte Script de exemplo para importar certificados para o seu armazenamento confiável.
nota
Ao atualizar o armazenamento confiável, é possível reter certificados mais antigos, além de adicionar os novos certificados.
Se você estiver usando o driver JDBC mysql 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_trust_store/MyTruststore.jks
-Djavax.net.ssl.trustStorePassword=my_trust_store_password
com.companyName.MyApplication
nota
Especifique uma senha diferente do prompt mostrado aqui como prática recomendada de segurança.
Exemplo de código Java para estabelecer conexões SSL
O exemplo de código a seguir mostra como configurar a conexão SSL que valida o certificado de servidor usando JDBC.
public class MySQLSSLTest { private static final String DB_USER = "
username
"; private static final String DB_PASSWORD = "password
"; // This trust store has only the prod root ca. private static final String TRUST_STORE_FILE_PATH = "file-path-to-trust-store
"; private static final String TRUST_STORE_PASS = "trust-store-password
"; public static void test(String[] args) throws Exception { Class.forName("com.mysql.jdbc.Driver"); System.setProperty("javax.net.ssl.trustStore", TRUST_STORE_FILE_PATH); System.setProperty("javax.net.ssl.trustStorePassword", TRUST_STORE_PASS); Properties properties = new Properties(); properties.setProperty("sslMode", "VERIFY_IDENTITY"); properties.put("user", DB_USER); properties.put("password", DB_PASSWORD); Connection connection = null; Statement stmt = null; ResultSet rs = null; try { connection = DriverManager.getConnection("jdbc:mysql://mydatabase.123456789012.us-east-1.rds.amazonaws.com:3306
",properties); stmt = connection.createStatement(); rs=stmt.executeQuery("SELECT 1 from dual"); } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } return; } }
Importante
Depois de determinar que suas conexões com o banco de dados usam SSL/TLS e ter atualizado o armazenamento confiável de aplicações, você poderá atualizar o banco de dados para usar os certificados rds-ca-rsa2048-g1. Para obter instruções, consulte a etapa 3 em Atualizar o certificado CA modificando a instância ou o cluster de banco de dados.
Especifique uma senha diferente do prompt mostrado aqui como prática recomendada de segurança.