MySQL veritabanına bağlanırken SSL bağlantısı hakkında uyarı


312

Aşağıdaki iki sınıfla, bir MySQL veritabanına bağlanmaya çalıştım. Ancak, her zaman bu hatayı alıyorum:

Çarşamba 09:46:52 CET 2015 UYARI: Sunucunun kimlik doğrulaması olmadan SSL bağlantısı kurulması önerilmez. MySQL 5.5.45+, 5.6.26+ ve 5.7.6+ gereksinimlerine göre, açık seçenek ayarlanmamışsa varsayılan olarak SSL bağlantısı kurulmalıdır. SSL kullanmayan mevcut uygulamalarla uyumluluk için verifyServerCertificate özelliği 'false' olarak ayarlanır. UseSSL = false ayarlayarak SSL'yi açıkça devre dışı bırakmanız veya useSSL = true ayarlayıp sunucu sertifikası doğrulaması için güven deposu sağlamanız gerekir.

Bu mainyöntemle test sınıfıdır :

public class TestDatabase {

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

Bu Databasesınıf:

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
Cevap için teşekkürler, onun ok, ben sadece benim string connectionURL sonunda ssl = true veya false koymak gerektiğini bilmiyordum.
Milos86

teşekkürler, yeni bağlantıURL nasıl?
user3290180

4
Bu bir hata değil, bir uyarı.
Fernando Silveira

Yanıtlar:


577

Bağlantı URL'niz aşağıdaki gibi olmalıdır,

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

Bu SSL'yi devre dışı bırakır ve SSL hatalarını da bastırır.


41
jdbc bağlantı dizesinde yarı kolon ile
bitmesi GEREKMEMEKTEDİR

8
tomcat bağlam dosyasında jdbc: mysql: // localhost: 3306 / databaseName? autoReconnect = true; useSSL = false;
amith

27
Noktalı virgülle karışıklık, büyük olasılıkla XML yapılandırmasında? AutoReconnect = true & amp; useSSL = false olarak sahip olmanız gerektiğinden kaynaklanmaktadır. Aksi takdirde ayrıştırıcı, ';' ile bitmeniz gereken garip bir varlığınız olduğunu düşünür.
Bostone

25
Ben hazırda aynı sorunu vardı ama böyle URL ile çözüldü: jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false kullandığım & amp; yerine &
Saqib Ahmed

2
@ Ağ güvenliyse SSL'yi devre dışı bırakma vakaları vardır. Örneğin, yalnızca aynı fiziksel donanımdaki istemciler tarafından erişilen kaplarda çalışan SQL sunucularım var.
Rodney

131

SSL kullanmaya ama sunucu doğrulamayı kapatmaya ne dersiniz (örneğin kendi bilgisayarınızda geliştirme modundayken):

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

IntelliJ / DataGrip üzerinden SSL üzerinden bir MySQL veritabanına bağlanmak için yapmam gereken şey buydu
Swaraj

23

Şunu belirtin url:

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

Ancak xml yapılandırmasında &işaretten bahsettiğinizde , IDE aşağıdaki hatayı gösterir:

"UseSSL" varlığına yapılan referans, ';' ile bitmelidir. sınırlayıcı.

Ve sonra açıkça kullanmak zorunda &yerine &olarak belirlenecek &tarafından xmliçinde bundan sonra xmlböyle xml yapılandırmasında url vermek size adres:

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

22

Alternatif bir yöntem:

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

Kulağa hoş geliyor, ama bunu benim grails-app benim application.yml almak nasıl?
Fusca Software

12

Ben de bu uyarıyı buldum sonra bu örnek kod gibi bağlantı dizesine SSL = yanlış sonek kullanarak sabit.

Misal:

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

11

Bir MySQL sunucusuna bağlantı başlatmak için varsayılanlar yakın geçmişte değiştirildi ve (en popüler sorular ve yığın taşması üzerine hızlı bir bakışla) yeni değerler çok fazla karışıklığa neden oluyor. Daha da kötüsü, standart tavsiyenin SSL'yi tamamen devre dışı bırakmak gibi görünüyor, bu da yapımda bir felaket.

Şimdi, bağlantınız gerçekten ağa maruz kalmıyorsa (yalnızca localhost) veya gerçek veri olmayan üretim dışı bir ortamda çalışıyorsanız, emin olun: seçeneği ekleyerek SSL'yi devre dışı bırakmanın bir zararı yoktur useSSL=false.

Diğer herkes için, SSL'nin sertifika ve ana makine doğrulamasıyla çalışmasını sağlamak için aşağıdaki seçenekler kümesi gereklidir:

  • useSSL = true
  • sslMode = VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl = file: path_to_keystore
  • trustCertificateKeyStorePassword = şifre

Ek bir bonus olarak, zaten seçeneklerle oynadığınızı görünce, zayıf SSL protokollerini de devre dışı bırakmak kolaydır:

  • enabledTLSProtocols = TLSv1.2

Misal

Bu nedenle, çalışan bir örnek olarak aşağıdaki geniş adımları izlemeniz gerekir:

İlk olarak, MySQL sunucu ana bilgisayarı için geçerli bir sertifika oluşturduğunuzdan ve CA sertifikasının istemci ana bilgisayara yüklendiğinden emin olun (kendinden imzalı kullanıyorsanız, bunu manuel olarak yapmanız gerekir, ancak popüler genel CA'lar zaten orada olacak).

Ardından, java anahtar deposunun tüm CA sertifikalarını içerdiğinden emin olun. Debian / Ubuntu'da bu şu şekilde gerçekleştirilir:

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

Son olarak, bağlantı dizesini Debian / Ubuntu'da biraz benzer bir şey olacak şekilde gerekli tüm seçenekleri içerecek şekilde güncelleyin (gerektiği gibi uyarlayın):

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

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


Sadece bu doğru cevap değil, aynı zamanda en ayrıntılı ve güvenli. SSL ile ilgili bir uyarı alırsanız, bunu asla atlamamalısınız (korumalı alan ve yerel kurulumlar hariç). Azure MySQL'e bağlanan bir Kubernetes Keycloack 9.0.2 kümesi için doğru çözümü buldunuz. Çok teşekkürler!
iakko

10

mysql yolunuzu şöyle kullanmanız gerekir:

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

9

Bu benim için iyiydi:

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

9

MySQL ile bağlantı kurarken kovandaki sorunu çözmek için bunu kullanın

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

Ama neden ve operatörü ile almıyor ? Benim gibi bir şeyim vardı jdbc:mysql://localhost/metastore?useSSL=false&createDatabaseIfNotExist=true. Olmadan ve iyi çalışıyor.
Kulasangar

benim için kaydedilen değer sorunsuz çalıştı, bu yüzden bunu 2017'nin son aralık ayında bir cevap olarak işaretleyeceğim ve kovan-2.1.1 kovan sitesi.xml ile çalışacağım.
ArifMustafa

7

Ben yapılandırma xml hazırda bekleme için bu özelliği kullanın

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

olmadan - serverTimezone = UTC - çalışmıyor


4

Çözüm Düzeltmek için MySQL bağlantı dizesinin sonuna bir useSSL = false ekleyin:

ex.

application.properties

mysql veri kaynağı

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

Şu anda geliştirme modunda olduğum için tomSS'de değil mysql sunucu yapılandırmalarında useSSL'yi Hayır olarak ayarladım. Çalışma Ayarlarından Erişim Ayarlarını Yönetme \ Sunucu Bağlantılarını Yönetme -> Bağlantım seçildi. İç bağlantı sekmesi SSL sekmesine gitti ve ayarları devre dışı bıraktı. Benim için çalıştı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.