Conexión a una instancia de BD a través de JDBC
Aunque el certificado SSL es opcional si elige conectarse a una base de datos a través de la conectividad de bases de datos Java (JDBC), se recomienda descargar el certificado SSL para cifrar las conexiones por motivos de seguridad. De forma predeterminada, SSL está habilitado para nuevas instancias de TaurusDB. SSL cifra las conexiones a las instancias, pero prolonga el tiempo de respuesta de la conexión y aumenta el uso de la CPU. Antes de habilitar SSL, evalúe el impacto en el rendimiento del servicio. Para obtener detalles sobre cómo habilitar o deshabilitar SSL, consulte Configuración de SSL.
Requisitos previos
Familiarícese con:
- Conceptos básicos de computadora
- Lenguaje de programación Java
- Conocimiento de JDBC
Conexión con el certificado SSL
El certificado SSL debe descargarse y verificarse para conectarse a bases de datos.

Si el valor ssl_type de un usuario de base de datos es x509, este método no está disponible.
Para comprobar el valor ssl_type del usuario actual, ejecute el siguiente comando:
select ssl_type from mysql.user where user = 'xxx';
- Descargue el certificado de CA o el paquete de certificados.
- En la página Instances, haga clic en el nombre de la instancia para ir a la página Basic Information.
- Haga clic en Download en SSL.
- 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 del 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\jdk11.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_8.0.22_Auto_Generated_CA_Certificate Issuer: CN=MySQL_Server_8.0.22_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
- Conéctese a su instancia de TaurusDB con 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 del 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 con ECS, la dirección IP privada de la instancia es <instance_ip>. Puede ver la dirección IP privada en el área Network Information de la página Basic Information.
- Si está accediendo a la instancia con una red pública, <instance_ip> es la EIP que se ha enlazado a la instancia. Puede ver la EIP en el área Network Information de la página Basic Information.
- Si está accediendo a la instancia con una instancia de proxy, la dirección de proxy es <instance_ip>. Puede ver la dirección del proxy en la página Database Proxy.
<instance_port>
Puerto de base de datos de la instancia de BD. El puerto predeterminado es 3306.
NOTA:Puede ver el puerto de la base de datos en el área Network Information de la página Basic Information.
<database_name>
Nombre de la base de datos utilizado para conectarse a la instancia. El valor predeterminado es mysql.
<value1>
Valor de requireSSL, que indica si el servidor soporta 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 configurado en 2.
<password>
Contraseña del archivo truststore configurado 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 TaurusDB):
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.sql.SQLException; public class JDBCTest { //There will be security risks if the username and password used for authentication are directly written into code. Store the username and password in ciphertext in the configuration file or environment variables. //In this example, the username and password are stored in the environment variables. Before running the code, set environment variables EXAMPLE_USERNAME_ENV and EXAMPLE_PASSWORD_ENV as needed. static final String USER = System.getenv("EXAMPLE_USERNAME_ENV"); static final String PASS = System.getenv("EXAMPLE_PASSWORD_ENV"); 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.
- Conéctese a su instancia de TaurusDB con JDBC.
jdbc:mysql://<instance_ip>:<instance_port>/<database_name>?useSSL=false
Tabla 4 Descripción del 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 con ECS, la dirección IP privada de la instancia es <instance_ip>. Puede ver la dirección IP privada en el área Network Information de la página Basic Information.
- Si está accediendo a la instancia con una red pública, <instance_ip> es la EIP que se ha enlazado a la instancia. Puede ver la EIP en el área Network Information de la página Basic Information.
<instance_port>
Puerto de base de datos de la instancia de BD. El puerto predeterminado es 3306.
NOTA:Puede ver el puerto de la base de datos en el área Network Information de la página Basic Information.
<database_name>
Nombre de la base de datos utilizado para conectarse a la instancia. El valor predeterminado es mysql.
Ejemplo de código (código Java para conectarse a una instancia de TaurusDB):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"); //There will be security risks if the username and password used for authentication are directly written into code. Store the username and password in ciphertext in the configuration file or environment variables. //In this example, the username and password are stored in the environment variables. Before running the code, set environment variables EXAMPLE_USERNAME_ENV and EXAMPLE_PASSWORD_ENV as needed. conn = DriverManager.getConnection(url, System.getenv("EXAMPLE_USERNAME_ENV"), System.getenv("EXAMPLE_PASSWORD_ENV")); 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 su instancia de TaurusDB con un certificado SSL descargado, se informa de 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. Por 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, véase 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 controladores de conexión 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
- 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, véase Conexión segura mediante SSL.)