Actualización de aplicaciones para la conexión a las instancias de base de datos de MySQL con los nuevos certificados SSL/TLS - Amazon Relational Database Service

Actualización de aplicaciones para la conexión a las instancias de base de datos de MySQL con los nuevos certificados SSL/TLS

El 13 de enero de 2023, Amazon RDS publicó nuevos certificados de entidades de certificación (CA) para la conexión a sus instancias de base de datos de RDS mediante la capa de sockets seguros o seguridad de la capa de transporte (SSL/TLS). Después, puede encontrar la información sobre la actualización de sus aplicaciones para utilizar los nuevos certificados.

Este tema puede ayudarle a determinar si las aplicaciones de cualquier cliente utilizan SSL/TLS para conectarse a sus instancias de base de datos. Si lo hacen, puede comprobar de manera adicional si esas aplicaciones precisan una verificación de certificados para conectarse.

nota

Algunas aplicaciones solo están configuradas para conectarse a las instancias de base de datos de MySQL solo si pueden verificar con éxito el certificado del servidor. Para esas aplicaciones, debe actualizar los almacenes de confianza de la aplicación de su cliente para incluir los nuevos certificados de CA.

Puede especificar los siguientes modos SSL: disabled, preferred y required. Cuando utiliza el modo SSL preferred y el certificado de CA no existe o no está actualizado, la conexión vuelve a no utilizar SSL y se conecta sin cifrado.

Dado que estas versiones posteriores utilizan el protocolo OpenSSL, un certificado de servidor caducado no impide que se realicen conexiones correctas a menos que se especifique el modo SSL required.

Recomendamos evitar el modo preferred. En modo preferred, si la conexión encuentra un certificado no válido, deja de usar el cifrado y continúa sin cifrar.

Después actualizar sus certificados de CA en los almacenes de confianza de la aplicación de su cliente, puede rotar los certificados en sus instancias de base de datos. Recomendamos encarecidamente probar estos procedimientos en un entorno de desarrollo o ensayo antes de implementarlos en sus entornos de producción.

Para obtener más información acerca de la rotación de certificados, consulte Rotar certificados SSL/TLS. Para obtener más información acerca de cómo descargar certificados, consulte Uso de SSL/TLS para cifrar una conexión a una instancia o clúster de base de datos. Para obtener información sobre el uso de SSL/TLS con las instancias de base de datos de MySQL, consulte Uso de SSL/TLS con una instancia de base de datos MySQL.

Determinación de si alguna aplicación se conecta a su instancia de base de datos de MySQL mediante SSL

Si utiliza Amazon RDS para la versión 5.7 u 8.0 de MySQL y el esquema de rendimiento se activa, ejecute la siguiente consulta para comprobar si las conexiones utilizan SSL/TLS. Para obtener información sobre la habilitación del esquema de rendimiento, consulte Inicio rápido del esquema de rendimiento en la documentación de MySQL.

mysql> SELECT id, user, host, connection_type FROM performance_schema.threads pst INNER JOIN information_schema.processlist isp ON pst.processlist_id = isp.id;

En estos resultados de ejemplo, puede ver que su propia sesión (admin) y una aplicación con sesión iniciada como webapp1 utilizan 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)

Determinación de si un cliente necesita una verificación de certificados para conectarse

Puede comprobar si los cliente de JDBC y MySQL precisan la verificación de certificados para conectarse.

JDBC

El siguiente ejemplo con el conector de MySQL/J 8.0 muestra una manera de comprobar las propiedades de conexión de JDBC de una aplicación para determinar si las conexiones exitosas precisan un certificado válido. Para obtener más información sobre todas las opciones de conexión de JDBC para MySQL, consulte Propiedades de la configuración en la documentación de MySQL.

Al utilizar el conector de MySQL/J 8.0, una conexión requiere verificación con el certificado de servidor de base de datos si en sus propiedades de conexión se ha configurado sslMode en VERIFY_CA o VERIFY_IDENTITY, como en el siguiente ejemplo.

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

Si utiliza MySQL Java Connector v5.1.38 o posterior, o MySQL Java Connector v8.0.9 o posterior para conectarse a sus bases de datos, incluso si no ha configurado explícitamente sus aplicaciones para usar SSL/TLS al conectarse a sus bases de datos, estos controladores cliente utilizan de forma predeterminada SSL/TLS. Además, al utilizar SSL/TLS, realizan una verificación parcial del certificado y producen un error al conectarse si el certificado del servidor de base de datos ha caducado.

MySQL

Los siguientes ejemplos con el cliente de MySQL muestran dos maneras de comprobar la conexión a MySQL de un script para determinar si las conexiones exitosas precisan un certificado válido. Para obtener más información sobre todas las opciones de conexión con el cliente de MySQL, consulte Configuración del lado del cliente para las conexiones cifradas en la documentación de MySQL.

Al utilizar el cliente de MySQL 5.7 o 8.0, una conexión SSL precisa una verificación frente al certificado de CA del servidor si para la opción de --ssl-mode especifica VERIFY_CA o VERIFY_IDENTITY, como en el siguiente ejemplo.

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

Al utilizar el cliente de MySQL 5.6, una conexión SSL precisa una verificación frente al certificado de CA del servidor si especifica la opción --ssl-verify-server-cert, como en el siguiente ejemplo.

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

Actualización del almacén de confianza de su aplicación

Para obtener información sobre la actualización del almacén de confianza para las aplicaciones de MySQL, consulte Instalación de certificados de SSL en la documentación de MySQL.

Para obtener información sobre la descarga del certificado raíz, consulte Uso de SSL/TLS para cifrar una conexión a una instancia o clúster de base de datos.

Para obtener secuencias de comandos de ejemplo que importan certificados, consulte Script de muestra para la importación de certificados en su almacén de confianza.

nota

Cuando actualice el almacén de confianza, puede retener certificados antiguos además de añadir los nuevos certificados.

Si utiliza el controlador de JDBC de MySQL en una aplicación, establezca las siguientes propiedades en la aplicación.

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

Cuando inicie la aplicación, establezca las siguientes propiedades.

java -Djavax.net.ssl.trustStore=/path_to_trust_store/MyTruststore.jks -Djavax.net.ssl.trustStorePassword=my_trust_store_password com.companyName.MyApplication
nota

Especifique una contraseña distinta de la que se muestra aquí como práctica recomendada de seguridad.

Ejemplo de código Java para el establecimiento de conexiones SSL

El siguiente ejemplo de código muestra cómo configurar la conexión SSL que valida el certificado del servidor mediante 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

Después de que haya determinado que sus conexiones de base de datos utilizan SSL/TLS y haya actualizado el almacén de confianza de su aplicación, puede actualizar su base de datos para que utilice los certificados de rds-ca-rsa2048-g1. Para obtener instrucciones, consulte el paso 3 en Actualización del certificado de entidad de certificación modificando la instancia o el clúster de base de datos.

Especifique una contraseña distinta de la que se muestra aquí como práctica recomendada de seguridad.