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();
            }
        }
    }
}

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.


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

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>

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

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"

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


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

9

Ini tidak masalah bagi saya:

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

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>

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


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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.