Avviso sulla connessione SSL durante la connessione al database MySQL


312

Con le due classi seguenti, ho provato a collegarmi a un database MySQL. Tuttavia, ottengo sempre questo errore:

Mer 09 22:46:52 CET 2015 WARN: sconsiglia di stabilire una connessione SSL senza la verifica dell'identità del server. In base ai requisiti MySQL 5.5.45+, 5.6.26+ e 5.7.6+, la connessione SSL deve essere stabilita per impostazione predefinita se l'opzione esplicita non è impostata. Per la conformità con le applicazioni esistenti che non utilizzano SSL, la proprietà confirmServerCertificate è impostata su "false". È necessario disabilitare esplicitamente SSL impostando useSSL = false oppure impostare useSSL = true e fornire truststore per la verifica del certificato del server.

Questa è la classe di test con il mainmetodo:

public class TestDatabase {

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

Questa è la Databaseclasse:

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
Grazie per la risposta, va bene, non sapevo che avrei dovuto mettere ssl = true o false alla fine della mia connessione StringURL.
Milos86,

grazie, allora com'è la nuova connessioneURL?
user3290180,

4
Non è un errore, è un avvertimento.
Fernando Silveira,

Risposte:


577

L'URL della connessione dovrebbe essere simile al seguente,

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

Questo disabiliterà SSL e anche sopprimerà gli errori SSL.


41
nella stringa di connessione jdbc NON DOVREBBE terminare con i due punti
Amith

8
nel file di contesto Tomcat jdbc: mysql: // localhost: 3306 / databaseName? autoReconnect = true; useSSL = false;
Amith,

27
La confusione con il punto e virgola è probabilmente dovuta al fatto che nella configurazione XML è necessario averlo come? AutoReconnect = true & amp; useSSL = false. Altrimenti il ​​parser pensa che tu abbia qualche strana entità con cui devi finire ';'
Bostone

25
Ho avuto lo stesso problema in ibernazione ma risolto da un URL come questo: jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false ho usato & amp; invece di &
Saqib Ahmed il

2
@Rogert che ci sono casi per disabilitare SSL se la rete è sicura. Ad esempio, ho server SQL in esecuzione in contenitori accessibili solo dai client sullo stesso hardware fisico.
Rodney,

131

Che ne dici di usare SSL ma disattivare la verifica del server (come quando sei in modalità di sviluppo sul tuo computer):

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

Questo è quello che dovevo fare per connettermi a un database MySQL su SSL tramite IntelliJ / DataGrip
Swaraj

23

Menziona urlsimili:

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

Ma nella configurazione XML quando si menziona il &segno, l'IDE mostra l'errore sotto:

Il riferimento all'entità "useSSL" deve terminare con ';' delimitatore.

E poi devi usare esplicitamente &invece di &essere determinato come &da quel momento in xmlpoi xmldevi dare l'URL in configurazione XML come questo:

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

22

Un metodo alternativo sarebbe:

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

Sembra bello, ma come ottengo questo nel mio application.yml della mia app grails?
Software Fusca,

12

Ho trovato anche questo avviso, quindi l'ho risolto utilizzando SSL = suffisso falso per la stringa di connessione come questo codice di esempio.

Esempio:

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

11

Le impostazioni predefinite per l'avvio di una connessione a un server MySQL sono state modificate nel recente passato e (da una rapida occhiata alle domande e risposte più comuni sullo stack overflow) i nuovi valori stanno causando molta confusione. Quel che è peggio è che il consiglio standard sembra essere quello di disabilitare del tutto SSL, il che è un po 'un disastro in corso.

Ora, se la tua connessione non è realmente esposta alla rete (solo localhost) o stai lavorando in un ambiente di non produzione senza dati reali, allora certo: non c'è nulla di male nel disabilitare SSL includendo l'opzione useSSL=false.

Per tutti gli altri, è necessario il seguente set di opzioni per far funzionare SSL con il certificato e la verifica dell'host:

  • useSSL = true
  • sslMode = VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl = file: path_to_keystore
  • trustCertificateKeyStorePassword = la password

Come bonus aggiuntivo, visto che stai già giocando con le opzioni, è semplice disabilitare anche i protocolli SSL deboli:

  • enabledTLSProtocols = TLSv1.2

Esempio

Quindi, come esempio funzionante, dovrai seguire i seguenti passaggi generali:

Innanzitutto, assicurati di avere un certificato valido generato per l'host del server MySQL e che il certificato CA sia installato sull'host client (se stai utilizzando l'auto-firma, probabilmente dovrai farlo manualmente, ma per il CA pubbliche popolari sarà già lì).

Quindi, assicurarsi che il keystore java contenga tutti i certificati CA. Su Debian / Ubuntu questo si ottiene eseguendo:

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

Quindi, aggiorna infine la stringa di connessione per includere tutte le opzioni richieste, che su Debian / Ubuntu sarebbe qualcosa di simile (adattalo come richiesto):

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

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


Non solo questa è la risposta giusta, ma è anche la più dettagliata e sicura. Se ricevi un avviso su SSL, non dovresti mai saltarlo (tranne sandbox e installazioni locali). Mi hai indicato la soluzione giusta per un cluster Kubernetes Keycloack 9.0.2 che si connette ad Azure MySQL. Molte grazie!
Ikko

10

devi utilizzare il tuo percorso mysql in questo modo:

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

9

Questo era OK per me:

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

9

Usalo per risolvere il problema in alveare durante la connessione 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>

Ma perché non ci vuole con l' operatore e ? Ho avuto qualcosa di simile jdbc:mysql://localhost/metastore?useSSL=false&createDatabaseIfNotExist=true. Senza il e funziona benissimo.
Kulasangar,

per me il valore pubblicato ha funzionato senza intoppi, quindi lo contrassegnerò come una risposta alla fine del mese di dicembre 2017 e lavorando con hive-2.1.1 hive-site.xml.
ArifMustafa,

7

Uso questa proprietà per ibernare in config xml

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

senza - serverTimezone = UTC - non funziona


4

Soluzione Per risolverlo, aggiungere un useSSL = false alla fine della stringa di connessione MySQL:

ex.

application.properties

origine dati 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

Dal momento che sono attualmente in modalità di sviluppo, ho impostato useSSL su No, non in Tomcat ma nelle configurazioni del server mysql. Sono andato a gestire le impostazioni di accesso \ Gestisci connessioni server dal workbench -> Ho selezionato la mia connessione. La scheda Connessione interna è andata alla scheda SSL e ha disabilitato le impostazioni. Ha funzionato per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.