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();
}
}
Jawaban:
Anda harus menambahkan opsi klien ke konektor mysql Anda
allowPublicKeyRetrieval=true
untuk memungkinkan klien meminta kunci publik secara otomatis dari server. Perhatikan bahwaAllowPublicKeyRetrieval=True
dapat 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=false
saat Anda menggunakannya untuk tujuan pengujian / pengembangancontoh:
sumber
useSSL=false&allowPublicKeyRetrieval=true
adalah yang saya butuhkan hanya ketika saya mencoba menghubungkan daridocker_container1
kedocker_container2_mysql(where mysql is installed)
dalam host lokal saya. Sedangkan dari mesin host saya kedocker_container2_mysql
,useSSL=false
sudah cukup.Gunakan
jdbc url
sebagai:PortNo: 3306
bisa berbeda dalam konfigurasi Andasumber
Untuk pengguna DBeaver :
Klik kanan koneksi Anda, pilih "Edit Connection"
Pada layar "Connection settings" (layar utama) klik "Edit Driver Settings"
Klik pada "Properti koneksi"
Klik kanan area "properti pengguna" dan pilih "Tambahkan properti baru"
Tambahkan dua properti: "useSSL" dan "allowPublicKeyRetrieval"
Tetapkan nilainya menjadi "false" dan "true" dengan mengklik dua kali pada kolom "nilai"
sumber
Sebagai alternatif untuk jawaban yang disarankan, Anda dapat mencoba dan menggunakan plugin otentikasi mysql_native_password alih-alih plugin otentikasi caching_sha2_password .
sumber
Saya menyelesaikan masalah ini menggunakan konfigurasi di bawah ini pada kerangka boot musim semi
sumber
Dalam kasus saya itu adalah kesalahan pengguna. Saya menggunakan
root
pengguna dengan kata sandi yang tidak valid. Saya tidak yakin mengapa saya tidak mendapatkan kesalahan autentikasi, melainkan menerima pesan samar ini.sumber
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.
sumber
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=true
bendera, tetapi saya terus mendapatkan kesalahan.Apa yang memperbaikinya untuk saya lakukan
Project->Clean
di 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 ...
sumber
Perbarui useSSL = true dalam koneksi aplikasi boot musim semi dengan mysql;
sumber
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:
sumber
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.
sumber
Berikan URL koneksi sebagai jdbc: mysql: // localhost: 3306 / hb_student_tracker? AllowPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC
sumber
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:
sumber
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
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.
sumber