Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Centro de ayuda/ Relational Database Service/ Guía del usuario/ Trabajar con RDS for MySQL/ Conexión de instancia/ Conexión a una instancia de RDS for MySQL a través de JDBC
Actualización más reciente 2024-06-06 GMT+08:00

Conexión a una instancia de RDS for MySQL a través de JDBC

Si se está conectando a una instancia a través de JDBC, un certificado SSL es opcional, pero el uso de un certificado SSL puede mejorar la seguridad de sus datos. SSL está deshabilitado de forma predeterminada para las instancias recién creadas. Puede habilitar SSL haciendo referencia a Configuring an SSL Connection. SSL cifra las conexiones a sus instancias, pero aumenta el tiempo de respuesta de la conexión y el uso de la CPU. Por esta razón, no se recomienda habilitar SSL.

Prerrequisitos

Usted está familiarizado con:

  • Conceptos básicos de computación.
  • Java.
  • JDBC.

Conexión con el certificado SSL

Descargue el certificado SSL y verifíquelo antes de conectarse a su instancia. Las instancias de base de datos de RDS for MySQL no admiten la autenticación basada en X.509.

  1. Descargue el certificado de CA o el paquete de certificados.

    1. En la página Instances, haga clic en el nombre de la instancia para ir a la página Basic Information.
    2. En el área DB Information, haga clic en a la derecha del conmutador SSL.

  2. Utilice la herramienta de claves para generar un archivo de almacén de confianza con el certificado de CA.

    <keytool installation path> ./keytool.exe -importcert -alias <MySQLCACert> -­file <ca.pem> -keystore <truststore_file> -storepass <password>
    Tabla 1 Descripción de parámetro

    Parámetro

    Descripción

    <keytool installation path>

    Directorio bin en la ruta de instalación JDK o JRE, por ejemplo, C:\Program Files (x86)\Java\jdk­11.0.7\bin.

    <MySQLCACert>

    Nombre del archivo de truststore. Establezca un nombre específico para el servicio para su identificación futura.

    <ca.pem>

    Nombre del certificado de CA descargado y descomprimido en 1, por ejemplo, ca.pem.

    <truststore_file>

    Ruta de acceso para almacenar el archivo truststore.

    <password>

    Contraseña del archivo truststore.

    Ejemplo de código (uso de keytool en la ruta de instalación de JDK para generar el archivo truststore):

    Owner:  CN=MySQL_Server_5.7.17_Auto_Generated_CA_Certificate
    Issuer: CN=MySQL_Server_5.7.17_Auto_Generated_CA_Certificate 
    Serial number: 1
    Valid from: Thu Feb 16 11:42:43 EST 2017 until: Sun Feb 14 11:42:43 EST 2027 
    Certificate fingerprints:
         MD5: 18:87:97:37:EA:CB:0B:5A:24:AB:27:76:45:A4:78:C1
         SHA1: 2B:0D:D9:69:2C:99:BF:1E:2A:25:4E:8D:2D:38:B8:70:66:47:FA:ED 
         SHA256:C3:29:67:1B:E5:37:06:F7:A9:93:DF:C7:B3:27:5E:09:C7:FD:EE:2D:18:86:F4:9C:40:D8:26:CB:DA:95: A0:24
         Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key 
         Version: 1
         Trust this certificate? [no]: y
         Certificate was added to keystore

  3. Conéctese a su instancia de RDS for MySQL a través de JDBC.

    jdbc:mysql://<instance_ip>:<instance_port>/<database_name>? 
    requireSSL=<value1>&useSSL=<value2>&verifyServerCertificate=<value3>&trustCertificateKeyStoreUrl=file: 
    <truststore_file>&trustCertificateKeyStorePassword=<password>
    Tabla 2 Descripción de parámetro

    Parámetro

    Descripción

    <instance_ip>

    Dirección IP de la instancia de base de datos.

    NOTA:
    • Si está accediendo a la instancia de base de datos a través de un ECS, instance_ip es la dirección IP flotante de la instancia. Puede ver la dirección IP flotante en el área Connection Information en la página Basic Information o Connectivity & Security.
    • Si está accediendo a la instancia de base de datos a través de una red pública, el instance_ip indica el EIP que se ha enlazado a la instancia. Puede ver la EIP en el área Connection Information en la página Connectivity & Security.

    <instance_port>

    Puerto de base de datos de la instancia de base de datos. El puerto predeterminado es 3306.

    NOTA:

    Puede ver el puerto de la base de datos en el área Connection Information de la página Connectivity & Security.

    <database_name>

    Nombre de base de datos utilizado para conectarse a la instancia de base de datos. El valor predeterminado es mysql.

    <value1>

    Valor de requireSSL que indica si el servidor admite SSL. Puede ser cualquiera de las siguientes:

    • true: El servidor admite SSL.
    • false: El servidor no admite SSL.
    NOTA:

    Para obtener más información acerca de la relación entre requireSSL y sslmode, consulte Tabla 3.

    <value2>

    Valor de useSSL que indica si el cliente utiliza SSL para conectarse al servidor. Puede ser cualquiera de las siguientes:

    • true: El cliente utiliza SSL para conectarse al servidor.
    • false: El cliente no utiliza SSL para conectarse al servidor.
      NOTA:

      Para obtener más información acerca de la relación entre useSSL y sslmode, consulte Tabla 3.

    <value3>

    Valor de verifyServerCertificate que indica si el cliente verifica el certificado de servidor. Puede ser cualquiera de las siguientes:

    • true: El cliente verifica el certificado del servidor.
    • false: El cliente no comprueba el certificado del servidor.
      NOTA:

      Para obtener más información acerca de la relación entre verifyServerCertificate y sslmode, consulte Tabla 3.

    <truststore_file>

    Ruta de acceso para almacenar el archivo de almacén de confianza establecido en 2.

    <password>

    Contraseña del archivo de almacén de confianza establecido en 2.

    Tabla 3 Relación entre parámetros de conexión y sslmode

    useSSL

    requireSSL

    verifyServerCertificate

    sslMode

    false

    N/A

    N/A

    DISABLED

    true

    false

    false

    PREFERRED

    true

    true

    false

    REQUIRED

    true

    N/A

    true

    VERIFY_CA

    Ejemplo de código (código Java para conectarse a una instancia de RDS for MySQL):

    import java.sql.Connection; 
    import java.sql.DriverManager; 
    import java.sql.ResultSet; 
    import java.sql.Statement;
    import java.sql.SQLException; 
    public class JDBCTest { 
        static final String USER = "xxx"; 
        static final String PASS = "xxx";
    
        public static void main(String[] args) {
            Connection conn = null; 
            Statement stmt = null;
    
            String url = "jdbc:mysql://<instance_ip>:<instance_port>/<database_name>?
    requireSSL=true&useSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file:
    <truststore_file>&trustCertificateKeyStorePassword=<password>";
            try { 
                Class.forName("com.mysql.cj.jdbc.Driver");
                conn = DriverManager.getConnection(url, USER, PASS);
                stmt = conn.createStatement(); 
                String sql = "show status like 'ssl%'";
                ResultSet rs = stmt.executeQuery(sql); 
    
                int columns = rs.getMetaData().getColumnCount();
                for (int i = 1; i <= columns; i++) {
                    System.out.print(rs.getMetaData().getColumnName(i));
                    System.out.print("\t");
                }
    
                while (rs.next()) { 
                    System.out.println(); 
                    for (int i = 1; i <= columns; i++) {
                        System.out.print(rs.getObject(i));
                        System.out.print("\t");
                    } 
                }
                rs.close(); 
                stmt.close(); 
                conn.close(); 
            } catch (SQLException se) { 
                se.printStackTrace(); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } finally { 
                // release resource .... 
            } 
        } 
    }

Conexión sin el certificado SSL

No es necesario descargar el certificado SSL porque no se requiere la verificación del certificado en el servidor.

  1. Conéctese a la instancia de base de datos de RDS for MySQL a través de JDBC.

    jdbc:mysql://<instance_ip>:<instance_port>/<database_name>?useSSL=false
    Tabla 4 Descripción de parámetro

    Parámetro

    Descripción

    <instance_ip>

    Dirección IP de la instancia de base de datos.

    NOTA:
    • Si está accediendo a la instancia de base de datos a través de un ECS, instance_ip es la dirección IP flotante de la instancia. Puede ver la dirección IP flotante en el área Connection Information en la página Basic Information o Connectivity & Security.
    • Si está accediendo a la instancia de base de datos a través de una red pública, el instance_ip indica el EIP que se ha enlazado a la instancia. Puede ver la EIP en el área Connection Information en la página Connectivity & Security.

    <instance_port>

    Puerto de base de datos de la instancia de base de datos. El puerto predeterminado es 3306.

    NOTA:

    Puede ver el puerto de la base de datos en el área Connection Information de la página Connectivity & Security.

    <database_name>

    Nombre de base de datos utilizado para conectarse a la instancia de base de datos. El valor predeterminado es mysql.

    Ejemplo de código (código Java para conectarse a una instancia de RDS for MySQL):

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    public class MyConnTest {
    	final public static void main(String[] args) {
    		Connection conn = null;
    		// set sslmode here.
    		// no ssl certificate, so do not specify path.
    		String url = "jdbc:mysql://192.168.0.225:3306/my_db_test?useSSL=false";
    		try {
    			Class.forName("com.mysql.jdbc.Driver");
    			conn = DriverManager.getConnection(url, "root", "password");
    			System.out.println("Database connected");
    
    			Statement stmt = conn.createStatement();
    			ResultSet rs = stmt.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");
    			while (rs.next()) {
    				System.out.println(rs.getString(1));
    			}
    			rs.close();
    			stmt.close();
    			conn.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    			System.out.println("Test failed");
    		} finally {
    			// release resource ....
    		}
    	}
    }

Problemas relacionados

  • Síntoma

    Cuando utiliza JDK 8.0 o una versión posterior para conectarse a una instancia de RDS for MySQL con un certificado SSL descargado, se notifica un error similar al siguiente:

    javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or
    cipher suites are inappropriate)
        at sun.security.ssl.HandshakeContext.<init>(HandshakeContext.java:171) ~[na:1.8.0_292]
        at sun.security.ssl.ClientHandshakeContext.<init>(ClientHandshakeContext.java:98) ~
    [na:1.8.0_292]
        at sun.security.ssl.TransportContext.kickstart(TransportContext.java:220) ~
    [na:1.8.0_292]
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:428) ~
    [na:1.8.0_292]
        at
    com.mysql.cj.protocol.ExportControlled.performTlsHandshake(ExportControlled.java:316) ~
    [mysql-connector-java-8.0.17.jar:8.0.17]
        at
    com.mysql.cj.protocol.StandardSocketFactory.performTlsHandshake(StandardSocketFactory.java
    :188) ~[mysql-connector-java8.0.17.jar:8.0.17]
        at
    com.mysql.cj.protocol.a.NativeSocketConnection.performTlsHandshake(NativeSocketConnection.
    java:99) ~[mysql-connector-java8.0.17.jar:8.0.17]
        at
    com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:331) ~
    [mysql-connector-java8.0.17.jar:8.0.17]
    ... 68 common frames omitted
  • Solución

    Especifique los valores de parámetro correspondientes en el enlace de código de 3 en función del paquete JAR utilizado por el cliente. Ejemplo:

    • mysql-connector-java-5.1.xx.jar (Para 8.0.18 y versiones anteriores, utilice el parámetro enabledTLSProtocols. Para obtener más información, consulte Conexión segura mediante SSL.)
      jdbc:mysql://<instance_ip>:<instance_port>/<database_name>? 
       requireSSL=true&useSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file: 
       <truststore_file>&trustCertificateKeyStorePassword=<password>&enabledTLSProtocols=TLSv1.2
    • mysql-connector-java-8.0.xx.jar (Para versiones posteriores a 8.0.18, utilice el parámetro tlsVersions.)
      jdbc:mysql://<instance_ip>:<instance_port>/<database_name>? 
       requireSSL=true&useSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file: 
       <truststore_file>&trustCertificateKeyStorePassword=<password>&tlsVersions=TLSv1.2