Ostrzeżenie o połączeniu SSL podczas łączenia się z bazą danych MySQL

312

W przypadku dwóch poniższych klas próbowałem połączyć się z bazą danych MySQL. Jednak zawsze pojawia się ten błąd:

Śr. 09 grudnia 22:46:52 CET 2015 OSTRZEŻENIE: Nawiązywanie połączenia SSL bez weryfikacji tożsamości serwera nie jest zalecane. Zgodnie z wymaganiami MySQL 5.5.45+, 5.6.26+ i 5.7.6+ połączenie SSL musi zostać nawiązane domyślnie, jeśli nie jest ustawiona jawna opcja. W celu zapewnienia zgodności z istniejącymi aplikacjami, które nie używają protokołu SSL, właściwość VerifyServerCertificate ma wartość „fałsz”. Musisz jawnie wyłączyć protokół SSL, ustawiając parametr useSSL = false, lub ustawić parametr useSSL = true i podać magazyn zaufanych certyfikatów do weryfikacji certyfikatu serwera.

To jest klasa testowa z mainmetodą:

public class TestDatabase {

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

To jest Databaseklasa:

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
źródło
2
Dzięki za odpowiedź, jest ok, po prostu nie wiedziałem, że muszę umieścić ssl = true lub false na końcu mojego połączenia StringURL.
Milos86,
dzięki, więc jak to jest nowe połączenieURL?
user3290180,
4
To nie jest błąd, to ostrzeżenie.
Fernando Silveira,

Odpowiedzi:

577

Twój adres URL połączenia powinien wyglądać jak poniżej,

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

Spowoduje to wyłączenie SSL, a także pominie błędy SSL.

Priyank Gosalia
źródło
41
w połączeniu jdbc łańcuch NIE POWINIEN kończyć się średnikiem
Amith
8
w pliku kontekstowym tomcat jdbc: mysql: // localhost: 3306 / databaseName? autoReconnect = true; useSSL = false;
Amith
27
Pomylenie z średnikiem jest prawdopodobnie spowodowane faktem, że w konfiguracji XML musisz mieć to jako? AutoReconnect = true & amp; useSSL = false. W przeciwnym razie analizator składni myśli, że masz jakiś dziwny byt, z którym musisz zakończyć ';'
Bostone
25
Miałem ten sam problem z hibernacją, ale został rozwiązany przez URL w następujący sposób: jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false użyłem & amp; zamiast &
Saqib Ahmed
2
@Roger, że istnieją przypadki wyłączenia SSL, jeśli sieć jest bezpieczna. Na przykład mam serwery SQL działające w kontenerach, do których dostęp mają tylko klienci na tym samym sprzęcie fizycznym.
Rodney
131

Co powiesz na używanie SSL, ale wyłączenie weryfikacji serwera (na przykład w trybie programowania na własnym komputerze):

jdbc:mysql://localhost:3306/Peoples?verifyServerCertificate=false&useSSL=true
Peter DeGregorio
źródło
Właśnie to musiałem zrobić, aby połączyć się z bazą danych MySQL przez SSL za pośrednictwem IntelliJ / DataGrip
Swaraj,
23

Wspomnij o url:

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

Ale w konfiguracji xml, kiedy wspominasz o &znaku, IDE pokazuje następujący błąd:

Odwołanie do encji „useSSL” musi kończyć się na „;” ogranicznik.

A potem trzeba jawnie użyć &zamiast &być określana jako &o xmlniej w xmltrzeba podać adres URL w konfiguracji xml jak poniżej:

<property name="connection.url">jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&amp;useSSL=false</property>
ArifMustafa
źródło
22

Alternatywną metodą byłoby:

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
źródło
Brzmi nieźle, ale jak mam to zrobić w mojej application.yml mojej aplikacji grails?
Fusca Software,
12

Znalazłem to ostrzeżenie, a następnie naprawiłem je, używając SSL = fałszywy przyrostek w ciągu połączenia, tak jak w tym przykładowym kodzie.

Przykład:

connectionString = "jdbc:mysql://{server-name}:3306/%s?useUnicode=yes&characterEncoding=UTF-8&useSSL=false"
Khachornchit Songsaen
źródło
11

Domyślne ustawienia inicjowania połączenia z serwerem MySQL zostały zmienione w niedawnej przeszłości i (od szybkiego przejrzenia najpopularniejszych pytań i odpowiedzi na temat przepełnienia stosu) nowe wartości powodują wiele zamieszania. Co gorsza, standardowa rada zdaje się całkowicie wyłączać SSL, co jest trochę katastrofą w trakcie tworzenia.

Teraz, jeśli twoje połączenie nie jest rzeczywiście narażone na działanie sieci (tylko host lokalny) lub pracujesz w środowisku nieprodukcyjnym bez rzeczywistych danych, to na pewno: wyłączenie tej opcji nie zaszkodzi useSSL=false.

Dla wszystkich innych wymagany jest następujący zestaw opcji, aby protokół SSL działał z weryfikacją certyfikatu i hosta:

  • useSSL = true
  • sslMode = VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl = plik: ścieżka_do_keystore
  • trustCertificateKeyStorePassword = hasło

Jako dodatkowy bonus, ponieważ już grasz z opcjami, łatwo jest również wyłączyć słabe protokoły SSL:

  • enabledTLSProtocols = TLSv1.2

Przykład

Tak więc jako działający przykład musisz wykonać następujące ogólne kroki:

Po pierwsze, upewnij się, że masz wygenerowany prawidłowy certyfikat dla hosta serwera MySQL oraz że certyfikat CA jest zainstalowany na hoście klienta (jeśli używasz samopodpisu, prawdopodobnie będziesz musiał to zrobić ręcznie, ale dla popularne publiczne urzędy certyfikacji już tam będą).

Następnie upewnij się, że magazyn kluczy Java zawiera wszystkie certyfikaty CA. W systemie Debian / Ubuntu można to osiągnąć, uruchamiając:

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

Następnie zaktualizuj parametry połączenia, tak aby zawierały wszystkie wymagane opcje, które na Debianie / Ubuntu byłyby nieco podobne (dostosuj zgodnie z wymaganiami):

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

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

Buffonizm
źródło
To nie tylko właściwa odpowiedź, ale także najbardziej szczegółowa i bezpieczna. Jeśli pojawi się ostrzeżenie dotyczące protokołu SSL, nigdy nie należy go pomijać (z wyjątkiem piaskownicy i instalacji lokalnych). Wskazałeś mi właściwe rozwiązanie dla klastra Kubernetes Keycloack 9.0.2 łączącego się z Azure MySQL. Wielkie dzięki!
iakko
10

musisz użyć swojej ścieżki mysql w następujący sposób:

<property name="url" value="jdbc:mysql://localhost:3306/world?useSSL=true"/>
harun ugur
źródło
9

To było dla mnie OK:

this.conn = (Connection)DriverManager
    .getConnection(url + dbName + "?useSSL=false", userName, password);
Tomal
źródło
9

Użyj tego, aby rozwiązać problem w gałęzi podczas nawiązywania połączenia z 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
źródło
Ale dlaczego nie bierze się z operatorem i ? Miałem coś takiego jdbc:mysql://localhost/metastore?useSSL=false&createDatabaseIfNotExist=true. Bez i działa dobrze.
Kulasangar,
dla mnie opublikowana wartość działała sprawnie, więc oznaczę ją jako odpowiedź na koniec grudnia 2017 r. i pracuję z hive-2.1.1 hive-site.xml.
ArifMustafa,
7

Używam tej właściwości do hibernacji w config xml

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

bez - serverTimezone = UTC - to nie działa

Aliaksandr Kawalenka
źródło
4

Rozwiązanie Aby to naprawić, dodaj useSSL = false na końcu ciągu połączenia MySQL:

dawny.

application.properties

źródło danych 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
źródło
2

nowe wersje konektora mysql domyślnie ustanawiają połączenie SSL ... aby je rozwiązać:

Pobierz starszą wersję konektora mysql, takiego jak mysql-connector-java-5.0.8.zip

. . lub. . Pobierz OpenSSL dla Windows i postępuj zgodnie z instrukcjami, jak to ustawić

Ahmad.ak
źródło
0

Ponieważ jestem obecnie w trybie programowania, ustawiłem useSSL na Nie, nie w tomcat, ale w konfiguracjach serwera mysql. Poszedł do Zarządzaj ustawieniami dostępu \ Zarządzaj połączeniami serwera ze środowiska roboczego -> Wybrałem moje połączenie. Wewnątrz zakładka połączenia przeszła do zakładki SSL i wyłączyła ustawienia. Pracował dla mnie.

Deepali Maniyar
źródło