Koneksi Java-MySql: Pengambilan Kunci Publik tidak diperbolehkan

105

Saya mencoba menghubungkan database MySql dengan Java menggunakan konektor 8.0.11. Semuanya tampak baik-baik saja tetapi saya memiliki pengecualian ini:

Pengecualian di utas "utama" java.sql.SQLNonTransientConnectionException: Pengambilan Kunci Publik tidak diizinkan

Pelacakan Tumpukan:

    Exception in thread "main" java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:108) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at 
 com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:862) at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:444) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:230) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:226) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:438) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:146) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:119) at ConnectionManager.getConnection(ConnectionManager.java:28) at Main.main(Main.java:8)

Manajer Konektor:

public class ConnectionManager {

    public static final String serverTimeZone = "UTC";
    public static final String serverName = "localhost";
    public static final String databaseName ="biblioteka";
    public static final int portNumber = 3306;
    public static final String user = "anyroot";
    public static final String password = "anyroot";

    public static Connection getConnection() throws SQLException {

        MysqlDataSource dataSource = new MysqlDataSource();

        dataSource.setUseSSL( false );
        dataSource.setServerTimezone( serverTimeZone );
        dataSource.setServerName( serverName );
        dataSource.setDatabaseName( databaseName );
        dataSource.setPortNumber( portNumber );
        dataSource.setUser( user );
        dataSource.setPassword( password );

        return dataSource.getConnection();
    }
}
danny
sumber
1
Harap berikan beberapa kode: bagaimana Anda mencoba untuk terhubung. Pelacakan tumpukan pengecualian juga akan membantu.
Sergei Sirik

Jawaban:

230

Anda harus menambahkan opsi klien ke konektor mysql Anda allowPublicKeyRetrieval=trueuntuk memungkinkan klien meminta kunci publik secara otomatis dari server. Perhatikan bahwa AllowPublicKeyRetrieval=Truedapat memungkinkan proxy jahat untuk melakukan serangan MITM untuk mendapatkan kata sandi teks biasa, jadi itu adalah False secara default dan harus diaktifkan secara eksplisit.

https://mysql-net.github.io/MySqlConnector/connection-options/

Anda juga dapat mencoba menambahkan useSSL=falsesaat Anda menggunakannya untuk tujuan pengujian / pengembangan

contoh:

jdbc:mysql://localhost:3306/db?allowPublicKeyRetrieval=true&useSSL=false
jtomaszk.dll
sumber
1
Nah, ini berhasil untuk saya tetapi saya tidak yakin seberapa sah opsi ini dari perspektif keamanan.
Priyank Thakkar
28
useSSL=false&allowPublicKeyRetrieval=trueadalah yang saya butuhkan hanya ketika saya mencoba menghubungkan dari docker_container1ke docker_container2_mysql(where mysql is installed)dalam host lokal saya. Sedangkan dari mesin host saya ke docker_container2_mysql, useSSL=falsesudah cukup.
prayagupd
1
allowPublicKeyRetrieval = true & amp; useSSL = false, jika Anda berhasil
Martin Klestil
2
Bisakah Anda menjelaskan mengapa ini terjadi?
Capn Sparrow
Menambahkan 'allowPublicKeyRetrieval = true' ke string koneksi JDBC saya menyelesaikan masalah sistem pengembangan saya setelah pembaruan Windows 10 kemarin. Kira Microsoft memasang lubang lain, dan opsi harus digunakan "hanya untuk pengembangan" dalam pandangan saya, di mana SSL tidak diaktifkan.
Alz
30

Gunakan jdbc urlsebagai:

jdbc:mysql://localhost:3306/Database_dbName?allowPublicKeyRetrieval=true&useSSL=false;

PortNo: 3306 bisa berbeda dalam konfigurasi Anda

susan097
sumber
Koreksi kecil di sini. Nilai yang dapat diterima properti koneksi 'useSSL' adalah: 'TRUE', 'FALSE', 'YES' atau 'NO'. Nilai 'false;' tidak bisa diterima.
bluelurker
27

Untuk pengguna DBeaver :

  1. Klik kanan koneksi Anda, pilih "Edit Connection"

  2. Pada layar "Connection settings" (layar utama) klik "Edit Driver Settings"

  3. Klik pada "Properti koneksi"

  4. Klik kanan area "properti pengguna" dan pilih "Tambahkan properti baru"

  5. Tambahkan dua properti: "useSSL" dan "allowPublicKeyRetrieval"

  6. Tetapkan nilainya menjadi "false" dan "true" dengan mengklik dua kali pada kolom "nilai"

Javier Aviles
sumber
10

Sebagai alternatif untuk jawaban yang disarankan, Anda dapat mencoba dan menggunakan plugin otentikasi mysql_native_password alih-alih plugin otentikasi caching_sha2_password .

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password_here'; 
Torsten Ojaperv
sumber
4

Saya menyelesaikan masalah ini menggunakan konfigurasi di bawah ini pada kerangka boot musim semi

spring.datasource.url=jdbc:mysql://localhost:3306/db-name?useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
shellhub.dll
sumber
1

Dalam kasus saya itu adalah kesalahan pengguna. Saya menggunakan rootpengguna dengan kata sandi yang tidak valid. Saya tidak yakin mengapa saya tidak mendapatkan kesalahan autentikasi, melainkan menerima pesan samar ini.

jus
sumber
1

Kesalahan di atas dalam kasus saya sebenarnya karena nama pengguna dan kata sandi yang salah. Memecahkan masalah: 1. Buka baris DriverManager.getConnection ("jdbc: mysql: // localhost: 3306 /? UseSSL = false", "username", "password"); Nama pengguna dan kata sandi bidang mungkin salah. Masukkan nama pengguna dan kata sandi yang Anda gunakan untuk memulai klien mysql Anda. Nama pengguna umumnya adalah root dan kata sandi adalah string yang Anda masukkan ketika layar yang mirip dengan ini muncul Layar Startup mysql

Catatan: Nama port 3306 mungkin berbeda dalam kasus Anda.

risingStark
sumber
1

Saya menemukan masalah ini membuat frustrasi karena saya dapat berinteraksi dengan database kemarin, tetapi setelah kembali pagi ini, saya mulai mendapatkan kesalahan ini.

Saya mencoba menambahkan allowPublicKeyRetrieval=truebendera, tetapi saya terus mendapatkan kesalahan.

Apa yang memperbaikinya untuk saya lakukan Project->Cleandi Eclipse danClean di server Tomcat saya. Salah satu (atau keduanya) memperbaikinya.

Saya tidak mengerti mengapa, karena saya membangun proyek saya menggunakan Maven, dan telah memulai ulang server saya setelah setiap perubahan kode. Sangat menjengkelkan ...

Cameron Hudson
sumber
1

Perbarui useSSL = true dalam koneksi aplikasi boot musim semi dengan mysql;

jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Bheem Singh
sumber
1

Saya juga menghadapi masalah seperti itu saat melakukan docker pada aplikasi kami yang ada. Solusi si untuk menambahkan opsi koneksi allowPublicKeyRetrieval MySQL dengan nilai true ke string koneksi JDBC. Jika tidak berhasil, coba tambahkan opsi useSSL ke false juga.

String yang dihasilkan akan terlihat seperti ini:

jdbc:mysql://<database server ip>:3306/databaseName?allowPublicKeyRetrieval=true&useSSL=false
Arun s
sumber
0

Solusi ini berfungsi untuk MacOS Sierra, dan menjalankan MySQL versi 8.0.11. Pastikan driver yang telah Anda tambahkan di jalur build - "tambahkan jar eksternal" harus sesuai dengan versi SQL.

String url = "jdbc:mysql://localhost:3306/syscharacterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
surendrapanday
sumber
0

Berikan URL koneksi sebagai jdbc: mysql: // localhost: 3306 / hb_student_tracker? AllowPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC

samit tiwary
sumber
0

Jika Anda mendapatkan kesalahan berikut saat menghubungkan mysql (baik lokal atau wadah mysql menjalankan mysql):

java.sql.SQLNonTransientConnectionException: Pengambilan Kunci Publik tidak diizinkan

Solusi: Tambahkan baris berikut di layanan database Anda:

command: --default-authentication-plugin=mysql_native_password
Rohtash Singh Lakra
sumber
0

Pertama-tama, pastikan server Database Anda aktif dan berjalan. Saya mendapatkan kesalahan yang sama, setelah mencoba semua jawaban yang tercantum di sini saya menemukan bahwa server Database saya tidak berjalan.

Anda dapat memeriksa hal yang sama dari MySQL Workbench, atau Command line menggunakan

mysql -u USERNAME -p

Ini terdengar jelas, tetapi sering kali kami berasumsi bahwa server basis data aktif dan berjalan sepanjang waktu, terutama ketika kami bekerja di mesin lokal kami, ketika kami memulai ulang / mematikan mesin, server basis data akan dimatikan secara otomatis.

Vinod Kumar KV
sumber