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();
            }
        }
    }
}
Milos86
fuente
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.

Priyank Gosalia
fuente
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
Peter DeGregorio
fuente
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>
ArifMustafa
fuente
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) {
...
}
Jon
fuente
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"
Khachornchit Songsaen
fuente
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

Bufonismo
fuente
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"/>
harun ugur
fuente
9

Esto estuvo bien para mí:

this.conn = (Connection)DriverManager
    .getConnection(url + dbName + "?useSSL=false", userName, password);
Tomal
fuente
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>
KARTHIKEYAN.A
fuente
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

Aliaksandr Kavalenka
fuente
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
Pravin
fuente
2

las nuevas versiones de mysql-connector establecen la conexión SSL por defecto ... para resolverlo:

Descargue la versión anterior de mysql-connector como mysql-connector-java-5.0.8.zip

. . o . Descarga OpenSSL para Windows y sigue las instrucciones sobre cómo configurarlo

Ahmad.ak
fuente
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.

Deepali Maniyar
fuente