Peringatan tentang koneksi SSL saat menghubungkan ke database MySQL

312

Dengan dua kelas di bawah ini, saya sudah mencoba terhubung ke database MySQL. Namun, saya selalu mendapatkan kesalahan ini:

Rab 09 Des 22:46:52 CET 2015 PERINGATAN: Membuat koneksi SSL tanpa verifikasi identitas server tidak disarankan. Menurut MySQL 5.5.45+, persyaratan 5.6.26+ dan 5.7.6+ Koneksi SSL harus ditetapkan secara default jika opsi eksplisit tidak diatur. Untuk kepatuhan dengan aplikasi yang sudah ada yang tidak menggunakan SSL, properti verifikasiServerCertificate diatur ke 'false'. Anda harus menonaktifkan SSL secara eksplisit dengan mengatur useSSL = false, atau mengatur useSSL = true dan memberikan truststore untuk verifikasi sertifikat server.

Ini adalah kelas tes dengan mainmetode:

public class TestDatabase {

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

Ini Databasekelasnya:

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
sumber
2
Terima kasih atas balasan, tidak apa-apa, saya hanya tidak tahu bahwa saya harus meletakkan ssl = benar atau salah pada akhir koneksi StringURL.
Milos86
terima kasih, jadi bagaimana dengan koneksi baruURL?
user3290180
4
Itu bukan kesalahan, itu peringatan.
Fernando Silveira

Jawaban:

577

URL koneksi Anda akan terlihat seperti di bawah ini,

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

Ini akan menonaktifkan SSL dan juga menekan kesalahan SSL.

Priyank Gosalia
sumber
41
dalam string koneksi jdbc TIDAK HARUS diakhiri dengan titik koma
Amith
8
dalam file konteks tomcat jdbc: mysql: // localhost: 3306 / databaseName? autoReconnect = true; useSSL = false;
Amith
27
Kebingungan dengan titik koma mungkin disebabkan oleh kenyataan bahwa dalam konfigurasi XML Anda perlu memilikinya sebagai? AutoReconnect = true & amp; useSSL = false. Kalau tidak, parser berpikir bahwa Anda memiliki entitas aneh yang harus diakhiri dengan ';'
Bostone
25
Saya memiliki masalah yang sama di hibernate tetapi diselesaikan dengan URL seperti ini: jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false Saya menggunakan & amp; bukannya &
Saqib Ahmed
2
@ Mempertimbangkan bahwa ada kasus untuk menonaktifkan SSL jika jaringan aman. Sebagai contoh, saya memiliki server SQL yang berjalan dalam wadah hanya diakses oleh klien pada perangkat keras fisik yang sama.
Rodney
131

Bagaimana dengan menggunakan SSL tetapi mematikan verifikasi server (seperti ketika dalam mode pengembangan di komputer Anda sendiri):

jdbc:mysql://localhost:3306/Peoples?verifyServerCertificate=false&useSSL=true
Peter DeGregorio
sumber
Inilah yang perlu saya lakukan untuk terhubung ke database MySQL melalui SSL melalui IntelliJ / DataGrip
Swaraj
23

Sebutkan urlseperti:

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

Tetapi dalam konfigurasi xml ketika Anda menyebutkan &tanda, IDE menunjukkan kesalahan di bawah ini:

Referensi ke entitas "useSSL" harus diakhiri dengan ';' pembatas.

Dan kemudian Anda harus secara eksplisit menggunakan &bukan &untuk ditetapkan sebagai &oleh xmlsetelahnya di xmlAnda harus memberikan url dalam konfigurasi xml seperti ini:

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

Metode alternatif adalah:

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
sumber
Kedengarannya bagus, tapi bagaimana saya memasukkan ini ke dalam application.yml dari aplikasi grails saya?
Fusca Software
12

Saya menemukan peringatan ini juga kemudian memperbaikinya dengan menggunakan SSL = false suffix ke string koneksi seperti contoh kode ini.

Contoh:

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

Default untuk memulai koneksi ke server MySQL telah diubah di masa lalu, dan (dari pandangan cepat melalui pertanyaan dan jawaban yang paling populer pada stack overflow) nilai-nilai baru menyebabkan banyak kebingungan. Yang lebih buruk adalah bahwa saran standar tampaknya menonaktifkan SSL sama sekali, yang merupakan sedikit bencana dalam pembuatan.

Sekarang, jika koneksi Anda benar-benar tidak terpapar ke jaringan (hanya hosting lokal) atau Anda bekerja di lingkungan non-produksi tanpa data nyata, maka yakin: tidak ada salahnya menonaktifkan SSL dengan memasukkan opsi useSSL=false.

Untuk orang lain, set opsi berikut diperlukan untuk membuat SSL berfungsi dengan sertifikat dan verifikasi host:

  • useSSL = true
  • sslMode = VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl = file: path_to_keystore
  • trustCertificateKeyStorePassword = kata sandi

Sebagai bonus tambahan, mengingat Anda sudah bermain dengan opsi, mudah untuk menonaktifkan protokol SSL yang lemah juga:

  • enabledTLSProtocols = TLSv1.2

Contoh

Jadi sebagai contoh kerja Anda harus mengikuti langkah-langkah luas berikut:

Pertama, pastikan Anda memiliki sertifikat yang valid yang dihasilkan untuk host server MySQL, dan bahwa sertifikat CA diinstal ke host klien (jika Anda menggunakan self-signed, maka Anda mungkin perlu melakukan ini secara manual, tetapi untuk CA publik populer itu sudah ada di sana).

Selanjutnya, pastikan bahwa java keystore berisi semua sertifikat CA. Pada Debian / Ubuntu ini dicapai dengan menjalankan:

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

Kemudian akhirnya, perbarui string koneksi untuk menyertakan semua opsi yang diperlukan, yang pada Debian / Ubuntu akan sedikit mirip (sesuaikan seperti yang diperlukan):

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

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

Buffoonism
sumber
Bukan hanya ini jawaban yang tepat, tetapi juga yang paling detail dan aman. Jika Anda mendapat peringatan tentang SSL, Anda tidak boleh melewatkannya (kecuali kotak pasir dan instalasi lokal). Anda mengarahkan saya ke solusi yang tepat untuk kluster Kubernetes Keycloack 9.0.2 yang terhubung ke Azure MySQL. Terima kasih banyak!
iakko
10

Anda perlu menggunakan jalur mysql Anda seperti ini:

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

Ini tidak masalah bagi saya:

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

Gunakan ini untuk memecahkan masalah di sarang sementara membuat koneksi dengan 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
sumber
Tetapi mengapa tidak dengan operator dan ? Saya punya sesuatu seperti jdbc:mysql://localhost/metastore?useSSL=false&createDatabaseIfNotExist=true. Tanpa dan itu berfungsi dengan baik.
Kulasangar
bagi saya nilai yang diposting bekerja dengan lancar, jadi saya akan menandai ini sebagai jawaban pada akhir bulan Desember 2017 dan bekerja dengan hive-2.1.1 hive-site.xml.
ArifMustafa
7

Saya menggunakan properti ini untuk hibernasi di konfigurasi xml

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

tanpa - serverTimezone = UTC - tidak berfungsi

Aliaksandr Kavalenka
sumber
4

Solusi Untuk memperbaikinya, tambahkan useSSL = false di akhir string koneksi MySQL:

ex.

properti aplikasi

sumber data 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
sumber
2

versi baru mysql-connector membuat koneksi SSL secara default ... untuk menyelesaikannya:

Unduh versi lama mysql-connector seperti mysql-connector-java-5.0.8.zip

. . atau . . Unduh OpenSSL untuk Windows dan ikuti instruksi cara mengaturnya

Ahmad.ak
sumber
0

Karena saya saat ini dalam mode pengembangan saya mengatur useSSL ke Tidak tidak di tomcat tetapi dalam konfigurasi server mysql. Pergi ke Mengelola Pengaturan Akses \ Kelola Koneksi Server dari meja kerja -> Memilih koneksi saya. Tab koneksi di dalam pergi ke tab SSL dan menonaktifkan pengaturan. Bekerja untukku.

Deepali Maniyar
sumber