Warnung zur SSL-Verbindung beim Herstellen einer Verbindung zur MySQL-Datenbank

312

Mit den beiden folgenden Klassen habe ich versucht, eine Verbindung zu einer MySQL-Datenbank herzustellen. Ich erhalte jedoch immer den folgenden Fehler:

Wed Dec 09 22:46:52 CET 2015 WARNUNG: Es wird nicht empfohlen, eine SSL-Verbindung ohne Überprüfung der Serveridentität herzustellen. Gemäß den Anforderungen von MySQL 5.5.45+, 5.6.26+ und 5.7.6+ muss standardmäßig eine SSL-Verbindung hergestellt werden, wenn keine explizite Option festgelegt ist. Für die Konformität mit vorhandenen Anwendungen, die kein SSL verwenden, wird die Eigenschaft verifyServerCertificate auf 'false' gesetzt. Sie müssen entweder SSL explizit deaktivieren, indem Sie useSSL = false festlegen, oder useSSL = true festlegen und einen Truststore für die Überprüfung des Serverzertifikats bereitstellen.

Dies ist die Testklasse mit der mainMethode:

public class TestDatabase {

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

Das ist die DatabaseKlasse:

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
quelle
2
Vielen Dank für die Antwort, es ist in Ordnung, ich wusste nur nicht, dass ich ssl = true oder false am Ende meiner String connectionURL setzen muss.
Milos86
danke, wie ist es also mit der neuen connectionURL?
user3290180
4
Es ist kein Fehler, es ist eine Warnung.
Fernando Silveira

Antworten:

577

Ihre Verbindungs-URL sollte wie folgt aussehen:

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

Dies deaktiviert SSL und unterdrückt auch die SSL-Fehler.

Priyank Gosalia
quelle
41
in jdbc Verbindungszeichenfolge sollte NICHT mit
Semikolon
8
in der Tomcat-Kontextdatei jdbc: mysql: // localhost: 3306 / databaseName? autoReconnect = true; useSSL = false;
Amith
27
Die Verwechslung mit Semikolon ist möglicherweise darauf zurückzuführen, dass Sie in der XML-Konfiguration "autoReconnect = true & useSSL = false" benötigen. Andernfalls denkt der Parser, dass Sie eine seltsame Entität haben, die Sie mit ';' beenden müssen.
Bostone
25
Ich hatte das gleiche Problem im Ruhezustand, wurde jedoch durch folgende URL behoben: jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false Ich habe & amp; anstelle von &
Saqib Ahmed
2
@ Roger, dass es Fälle gibt, in denen SSL deaktiviert wird, wenn das Netzwerk sicher ist. Zum Beispiel laufen SQL Server in Containern, auf die nur Clients auf derselben physischen Hardware zugreifen.
Rodney
131

Wie wäre es mit SSL, aber Deaktivieren der Serverüberprüfung (z. B. im Entwicklungsmodus auf Ihrem eigenen Computer):

jdbc:mysql://localhost:3306/Peoples?verifyServerCertificate=false&useSSL=true
Peter DeGregorio
quelle
Dies ist, was ich tun musste, um über SSL über IntelliJ / DataGrip
Swaraj
23

Erwähnen Sie urlFolgendes:

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

Wenn Sie jedoch in der XML-Konfiguration das &Zeichen erwähnen , zeigt die IDE den folgenden Fehler an:

Der Verweis auf die Entität "useSSL" muss mit dem ';' Trennzeichen.

Und dann müssen Sie explizit das verwenden, &anstatt &wie danach bestimmt zu &werden. Sie müssen die URL in der XML-Konfiguration wie folgt angeben:xmlxml

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

Eine alternative Methode wäre:

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
quelle
Hört sich gut an, aber wie bekomme ich das in meine application.yml meiner grails-app?
Fusca Software
12

Ich habe diese Warnung auch gefunden und sie dann mithilfe des Suffixes SSL = false für die Verbindungszeichenfolge wie in diesem Beispielcode behoben.

Beispiel:

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

Die Standardeinstellungen zum Herstellen einer Verbindung zu einem MySQL-Server wurden in der jüngeren Vergangenheit geändert, und (von einem kurzen Blick auf die beliebtesten Fragen und Antworten zum Stapelüberlauf) sorgen die neuen Werte für große Verwirrung. Was noch schlimmer ist, ist, dass der Standard-Ratschlag darin zu bestehen scheint, SSL insgesamt zu deaktivieren, was eine Katastrophe darstellt.

Wenn Ihre Verbindung wirklich nicht mit dem Netzwerk verbunden ist (nur localhost) oder Sie in einer Nicht-Produktionsumgebung ohne echte Daten arbeiten, können Sie SSL nicht deaktivieren, indem Sie die Option einschließen useSSL=false.

Für alle anderen sind die folgenden Optionen erforderlich, damit SSL mit der Zertifikat- und Hostüberprüfung funktioniert:

  • useSSL = true
  • sslMode = VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl = Datei: path_to_keystore
  • trustCertificateKeyStorePassword = Passwort

Als zusätzlichen Bonus können Sie auch die schwachen SSL-Protokolle deaktivieren, da Sie bereits mit den Optionen spielen:

  • enabledTLSProtocols = TLSv1.2

Beispiel

Als Arbeitsbeispiel müssen Sie also die folgenden allgemeinen Schritte ausführen:

Stellen Sie zunächst sicher, dass ein gültiges Zertifikat für den MySQL-Server-Host generiert wurde und dass das CA-Zertifikat auf dem Client-Host installiert ist (wenn Sie selbstsigniert verwenden, müssen Sie dies wahrscheinlich manuell tun, jedoch für das beliebte öffentliche Zertifizierungsstellen wird es bereits geben).

Stellen Sie als Nächstes sicher, dass der Java-Keystore alle CA-Zertifikate enthält. Unter Debian / Ubuntu wird dies erreicht, indem Folgendes ausgeführt wird:

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

Aktualisieren Sie schließlich die Verbindungszeichenfolge, um alle erforderlichen Optionen einzuschließen, die unter Debian / Ubuntu ungefähr so ​​aussehen würden (nach Bedarf anpassen):

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

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

Trottel
quelle
Dies ist nicht nur die richtige Antwort, sondern auch die detaillierteste und sicherste. Wenn Sie eine Warnung zu SSL erhalten, sollten Sie diese niemals überspringen (außer Sandbox und lokale Installationen). Sie haben mich auf die richtige Lösung für einen Kubernetes Keycloack 9.0.2-Cluster hingewiesen, der eine Verbindung zu Azure MySQL herstellt. Vielen Dank!
Iakko
10

Sie müssen Ihren MySQL-Pfad wie folgt verwenden:

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

Das war OK für mich:

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

Verwenden Sie diese Option, um das Problem in Hive zu lösen, während Sie eine Verbindung mit MySQL herstellen

<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
quelle
Aber warum dauert es nicht mit dem und Operator? Ich hatte so etwas wie jdbc:mysql://localhost/metastore?useSSL=false&createDatabaseIfNotExist=true. Ohne das und es funktioniert gut.
Kulasangar
Für mich hat der veröffentlichte Wert reibungslos funktioniert, daher werde ich dies Ende Dezember 2017 als Antwort markieren und mit hive-2.1.1 hive-site.xml arbeiten.
ArifMustafa
7

Ich verwende diese Eigenschaft für den Ruhezustand in config xml

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

ohne - serverTimezone = UTC - es funktioniert nicht

Aliaksandr Kavalenka
quelle
4

Lösung Um dies zu beheben, fügen Sie am Ende der MySQL-Verbindungszeichenfolge ein useSSL = false hinzu:

Ex.

application.properties

MySQL-Datenquelle

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
quelle
2

Die neuen Versionen von MySQL-Connector stellen standardmäßig eine SSL-Verbindung her ... um dies zu lösen:

Laden Sie die ältere Version von mysql-connector herunter, z. B. mysql-connector-java-5.0.8.zip

. . oder . . Laden Sie OpenSSL für Windows herunter und befolgen Sie die Anweisungen zum Einstellen

Ahmad.ak
quelle
0

Da ich mich derzeit im Entwicklungsmodus befinde, setze ich useSSL nicht in Tomcat, sondern in MySQL-Serverkonfigurationen auf Nein. Zugriffseinstellungen verwalten \ Serververbindungen über die Workbench verwalten -> Meine Verbindung ausgewählt. Die Registerkarte "Verbindung" ging zur Registerkarte "SSL" und deaktivierte die Einstellungen. Hat für mich gearbeitet.

Deepali Maniyar
quelle