Advertencia sobre la conexión SSL cuando se conecta a la base de datos MySQL


312

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

Mié 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 la opción explícita. Para cumplir con las aplicaciones existentes que no usan SSL, la propiedad generateServerCertificate se establece en 'falso'. Debe deshabilitar explícitamente SSL configurando useSSL = false, o bien 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();
            }
        }
    }
}

2
Gracias por responder, está bien, simplemente no sabía que tenía que poner ssl = true o false al final de mi String connectionURL.
Milos86

gracias, entonces, ¿cómo es la nueva conexión URL?
user3290180

44
No es un error, es una advertencia.
Fernando Silveira

Respuestas:


577

Su URL de conexión debe verse como la siguiente,

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

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


41
en cadena de conexión jdbc NO DEBE terminar con punto y coma
Amith

8
en el archivo de contexto de tomcat jdbc: mysql: // localhost: 3306 / databaseName? autoReconnect = true; useSSL = false;
Amith

27
La confusión con el punto y coma posiblemente se deba al hecho de que en la configuración XML debe tenerlo como? AutoReconnect = true & amp; useSSL = false. De lo contrario, el analizador cree que tienes alguna entidad extraña con la que debes terminar ';'
Bostone

25
Tuve el mismo problema en hibernación pero lo resolví mediante una URL como esta: jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false usé & amp; en lugar de &
Saqib Ahmed

2
@Rogertque existen casos para deshabilitar SSL si la red es segura. Por ejemplo, tengo servidores SQL que se ejecutan en contenedores a los que solo acceden los clientes en el mismo hardware físico.
Rodney

131

¿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

Esto es lo que necesitaba hacer para conectarme a una base de datos MySQL a través de SSL a través de IntelliJ / DataGrip
Swaraj

23

Mencione lo siguiente url:

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

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

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

Y entonces usted tiene que utilizar explícitamente el &lugar de &que se determine como &por xmldespués de eso en xmllo que tiene que dar la dirección URL en la configuración de XML como esto:

<property name="connection.url">jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&amp;useSSL=false</property>

22

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) {
...
}

Suena bien, pero ¿cómo consigo esto en mi aplicación.yml de mi aplicación grails?
Fusca Software

12

También encontré esta advertencia y luego la arreglé usando SSL = sufijo falso en la cadena de conexión como este código de ejemplo.

Ejemplo:

connectionString = "jdbc:mysql://{server-name}:3306/%s?useUnicode=yes&characterEncoding=UTF-8&useSSL=false"

11

Los valores predeterminados para iniciar una conexión a un servidor MySQL se cambiaron en el pasado reciente y (desde un vistazo rápido a través de las preguntas y respuestas más populares sobre el desbordamiento de la 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 no está realmente 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 ningún daño 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:

  • useSSL = verdadero
  • sslMode = VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl = archivo: path_to_keystore
  • trustCertificateKeyStorePassword = contraseña

Como una ventaja adicional, ya que ya estás jugando con las opciones, también es simple deshabilitar los protocolos SSL débiles:

  • enabledTLSProtocols = TLSv1.2

Ejemplo

Entonces, como ejemplo de trabajo, 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 la firma propia, es probable que deba hacerlo manualmente, pero para CA públicas populares ya estarán 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 similar (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


No solo esta es la respuesta correcta, sino que también es la más detallada y segura. Si recibe una advertencia sobre SSL, nunca debe omitirla (excepto sandbox e instalaciones locales). Me indicó la solución correcta para un clúster Kubernetes Keycloack 9.0.2 que se conecta a Azure MySQL. ¡Muchas gracias!
iakko

10

necesita usar su ruta mysql de esta manera:

<property name="url" value="jdbc:mysql://localhost:3306/world?useSSL=true"/>

9

Esto estuvo bien para mí:

this.conn = (Connection)DriverManager
    .getConnection(url + dbName + "?useSSL=false", userName, password);

9

Use esto para resolver el problema en la colmena mientras se conecta con MySQL

<property>
   <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true&amp;autoReconnect=true&amp;useSSL=false</value>
   <description>metadata is stored in a MySQL server</description>
</property>

Pero, ¿por qué no se necesita con el operador y ? Tenía algo así jdbc:mysql://localhost/metastore?useSSL=false&createDatabaseIfNotExist=true. Sin el y funciona bien.
Kulasangar

para mí, el valor publicado funcionó sin problemas, por lo que marcaré esto como respuesta a fines del mes de diciembre de 2017 y trabajaré con hive-2.1.1 hive-site.xml.
ArifMustafa

7

Yo uso esta propiedad para hibernar en config xml

<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/bookshop?serverTimezone=UTC&amp;useSSL=false
</property>

sin - serverTimezone = UTC - no funciona


4

Solución Para solucionarlo, agregue useSSL = false al final de la cadena de conexión MySQL:

ex.

application.properties

fuente de datos mysql

spring.datasource.url=jdbc:mysql://localhost/dbname?useSSL=false
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver


0

Como actualmente estoy en modo de desarrollo, configuro useSSL en No, no en tomcat sino en configuraciones de servidor mysql. Fui a administrar la configuración de acceso \ Administrar conexiones del servidor desde el banco de trabajo -> Seleccioné mi conexión. La pestaña de conexión interna fue a la pestaña SSL y deshabilitó la configuración. Trabajó para mi.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.