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 19 de septiembre de 2019, 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 conexión segura o la 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 entidad de certificación no existe o no está actualizado, se aplica el siguiente comportamiento:

  • Para las versiones secundarias de MySQL más recientes, la conexión vuelve a no usar SSL y sigue conectándose correctamente.

    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.

    Las siguientes versiones secundarias de MySQL utilizan el protocolo OpenSSL:

    • Todas las versiones MySQL 8.0

    • MySQL 5.7.21 y versiones posteriores a MySQL 5.7

    • MySQL 5.6.39 y versiones posteriores a MySQL 5.6

    • MySQL 5.5.59 y versiones posteriores a MySQL 5.5

  • En las versiones secundarias de MySQL más antiguas, se devuelve un error.

    Dado que estas versiones más antiguas utilizan el protocolo yaSSL, la verificación del certificado se aplica estrictamente y la conexión no es correcta.

    Las siguientes versiones secundarias de MySQL utilizan el protocolo yaSSL:

    • MySQL 5.7.19 y versiones anteriores a MySQL 5.7

    • MySQL 5.6.37 y versiones anteriores a MySQL 5.6

    • MySQL 5.5.57 y versiones anteriores a MySQL 5.5

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 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 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)

Si utiliza Amazon RDS para las versiones 5.5 o 5.6 de MySQL, no puede determinar desde el lado del servidor si las aplicaciones se conectan con o sin SSL. Para esas versiones, puede determinar si se utilizó SSL examinando el método de conexión de la aplicación. En la siguiente sección, puede encontrar más información sobre la examinación de la configuración de la conexión del cliente.

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 precisa una verificación frente al certificado de CA del servidor si sus propiedades de conexión han configurado sslMode como 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.

nota

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

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

Puede actualizar el almacén de confianza para las aplicaciones que utilizan JDBC para las conexiones SSL/TLS.

Para actualizar el almacén de confianza para las aplicaciones de JDBC

  1. Descargue el certificado raíz de 2019 que funciona con todas las regiones de AWS y coloque el archivo en el directorio del almacén de confianza.

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

  2. Convierta el certificado al formato .der con el siguiente comando.

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

    Reemplace el nombre de archivo por el que ha descargado.

  3. Importe el certificado en el almacén de claves utilizando el siguiente comando.

    keytool -import -alias rds-root -keystore clientkeystore -file rds-ca-2019-root.der
  4. Confirme que el almacén de claves se haya actualizado correctamente.

    keytool -list -v -keystore clientkeystore.jks

    Especifique la contraseña del almacén de claves cuando se le solicite.

    Su resultado debe contener lo siguiente.

    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

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_truststore/MyTruststore.jks -Djavax.net.ssl.trustStorePassword=my_truststore_password com.companyName.MyApplication

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 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 test(String[] args) throws Exception { Class.forName("com.mysql.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.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 ha actualizado el almacén de confianza de su aplicación, puede actualizar su base de datos para utilizar los certificados de rds-ca-2019. Para obtener instrucciones, consulte el paso 3 en Actualización del certificado de entidad de certificación modificando la instancia de base de datos.