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.