Advertencia sobre la conexión SSL al conectarse a la base de datos MySQL

Resuelto Milos86 asked hace 8 años • 0 respuestas

Con las dos clases siguientes, intenté conectarme a una base de datos MySQL. Sin embargo, siempre recibo este error:

Miércoles 09 de diciembre 22:46:52 CET 2015 ADVERTENCIA: No se recomienda establecer una conexión SSL sin la verificación de identidad del servidor. De acuerdo con los requisitos de MySQL 5.5.45+, 5.6.26+ y 5.7.6+, la conexión SSL debe establecerse de forma predeterminada si no se establece una opción explícita. Para cumplir con las aplicaciones existentes que no utilizan SSL, la propiedad verificarServerCertificate se establece en "falso". Debe deshabilitar SSL explícitamente configurando useSSL=false, o configurar useSSL=true y proporcionar un almacén de confianza para la verificación del certificado del servidor.

Esta es la clase de prueba con el mainmétodo:

public class TestDatabase {

    public static void main(String[] args) {
        Database db = new Database();
        try {
            db.connect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        db.close();
    }
}

Esta es la Databaseclase:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Database {

    private Connection con;

    public void connect() throws Exception{

        if(con != null) return;

        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            throw new Exception("No database");
        }

        String connectionURL = "jdbc:mysql://localhost:3306/Peoples";

        con = DriverManager.getConnection(connectionURL, "root", "milos23");        
    }

    public void close(){
        if(con != null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
Milos86 avatar Dec 10 '15 04:12 Milos86
Aceptado

La URL de su conexión debería verse como la siguiente,

jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false

Esto deshabilitará SSL y también suprimirá los errores de SSL.

Priyank Gosalia avatar Dec 24 '2015 07:12 Priyank Gosalia

¿Qué tal usar SSL pero desactivar la verificación del servidor (como cuando está en modo de desarrollo en su propia computadora)?

jdbc:mysql://localhost:3306/Peoples?verifyServerCertificate=false&useSSL=true
Peter DeGregorio avatar Nov 14 '2016 16:11 Peter DeGregorio

Los valores predeterminados para iniciar una conexión a un servidor MySQL se cambiaron en el pasado reciente y (de un vistazo rápido a las preguntas y respuestas más populares sobre el desbordamiento de pila) los nuevos valores están causando mucha confusión. Lo que es peor es que el consejo estándar parece ser desactivar SSL por completo, lo cual es un desastre en ciernes.

Ahora, si su conexión realmente no está expuesta a la red (solo localhost) o está trabajando en un entorno que no es de producción sin datos reales, entonces seguro: no hay nada de malo en deshabilitar SSL al incluir la opción useSSL=false.

Para todos los demás, se requiere el siguiente conjunto de opciones para que SSL funcione con el certificado y la verificación del host:

  • usarSSL=verdadero
  • sslMode=VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl=archivo:ruta_al_almacén de claves
  • trustCertificateKeyStorePassword=contraseña

Como ventaja adicional, dado que ya estás jugando con las opciones, también es sencillo desactivar los protocolos SSL débiles:

  • habilitadoTLSProtocols=TLSv1.2

Ejemplo

Entonces, como ejemplo práctico, deberá seguir los siguientes pasos generales:

Primero, asegúrese de tener un certificado válido generado para el host del servidor MySQL y de que el certificado de CA esté instalado en el host del cliente (si está utilizando autofirmado, probablemente necesitará hacerlo manualmente, pero para el CA públicas populares ya estará allí).

A continuación, asegúrese de que el almacén de claves de Java contenga todos los certificados de CA. En Debian/Ubuntu esto se logra ejecutando:

update-ca-certificates -f
chmod 644 /etc/ssl/certs/java/cacerts

Luego, finalmente, actualice la cadena de conexión para incluir todas las opciones requeridas, que en Debian/Ubuntu sería algo así como (adaptar según sea necesario):

jdbc:mysql://{mysql_server}/confluence?useSSL=true&sslMode=VERIFY_IDENTITY&trustCertificateKeyStoreUrl=file%3A%2Fetc%2Fssl%2Fcerts%2Fjava%2Fcacerts&trustCertificateKeyStorePassword=changeit&enabledTLSProtocols=TLSv1.2&useUnicode=true&characterEncoding=utf8

Referencia: https://beansandanicechianti.blogspot.com/2019/11/mysql-ssl-configuration.html

Buffoonism avatar Nov 06 '2019 11:11 Buffoonism

Mencione cosas urlsimilares:

jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&useSSL=false

Pero en la configuración xml, cuando mencionas &firmar, el IDE muestra el siguiente error:

La referencia a la entidad "useSSL" debe terminar con ';' delimitador.

Y luego debe usar explícitamente el &en lugar de &determinarlo, ya que a &partir de xmlentonces xmldebe proporcionar la URL en una configuración xml como esta:

<property name="connection.url">jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&amp;useSSL=false</property>
ArifMustafa avatar Jan 25 '2018 07:01 ArifMustafa

Un método alternativo sería:

    Properties properties = new Properties();
    properties.setProperty("user", "root");
    properties.setProperty("password", "milos23");
    properties.setProperty("useSSL", "false");

    try (Connection conn = DriverManager.getConnection(connectionUrl, properties)) {
    ...
    } catch (SQLException e) {
    ...
    }
Jon avatar Sep 02 '2016 21:09 Jon