Bağlantı Java-MySql: Genel Anahtar Erişimine izin verilmez


122

MySql veritabanını 8.0.11 bağlayıcı kullanarak Java ile bağlamayı deniyorum. Her şey yolunda görünüyor ama bu istisnam var:

"Main" iş parçacığında istisna java.sql.SQLNonTransientConnectionException: Genel Anahtar Erişime izin verilmez

Yığın izleme:

    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)

Bağlayıcı Yöneticisi:

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

1
Lütfen bir kod girin: nasıl bağlanmaya çalışıyorsunuz? İstisnanın yığın izlenmesi de yardımcı olacaktır.
Sergei Sirik

Yanıtlar:


266

İstemcinin allowPublicKeyRetrieval=truesunucudan genel anahtarı otomatik olarak istemesine izin vermek için mysql bağlantınıza istemci seçeneği eklemelisiniz . Not AllowPublicKeyRetrieval=Truekötü niyetli bir vekil, düz metin şifre almak için bir MITM saldırı gerçekleştirmek için izin verebilir bu nedenle varsayılan olarak False ve açıkça etkinleştirilmesi gerekir.

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

useSSL=falsetest etme / geliştirme amacıyla kullandığınızda da eklemeyi deneyebilirsiniz

misal:

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

1
Bu benim için işe yaradı ama bu seçeneklerin güvenlik açısından ne kadar yasal olduğundan emin değilim.
Priyank Thakkar

31
useSSL=false&allowPublicKeyRetrieval=trueBen bağlanırken çalıştı sadece ihtiyacım olan şey docker_container1için docker_container2_mysql(where mysql is installed)benim yerel konak içinde. Benim ana makinemden için docker_container2_mysql, useSSL=falseyeterli.
2018, 05

1
allowPublicKeyRetrieval = true & amp; useSSL = false, size
iyisi

2
Neden böyle olduğunu açıklayabilir misin?
Capn Sparrow

JDBC bağlantı dizime 'allowPublicKeyRetrieval = true' eklemek, dün bir Windows 10 güncellemesinden sonra geliştirme sistemimin sorununu çözdü. Sanırım Microsoft başka bir delik daha açtı ve seçenek benim görüşüme göre SSL'nin açık olmadığı "yalnızca geliştirme için" kullanılmalı.
Alz

37

For DBeaver kullanıcıları:

  1. Bağlantınızı sağ tıklayın, "Bağlantıyı Düzenle" yi seçin

  2. "Bağlantı ayarları" ekranında (ana ekran) "Sürücü Ayarlarını Düzenle" ye tıklayın

  3. "Bağlantı özellikleri" ni tıklayın

  4. "Kullanıcı özellikleri" alanını sağ tıklayın ve "Yeni mülk ekle" yi seçin

  5. İki özellik ekleyin: "useSSL" ve "allowPublicKeyRetrieval"

  6. "Değer" sütununa çift tıklayarak değerlerini "yanlış" ve "doğru" olarak ayarlayın


31

Kullanım şekli jdbc url:

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

PortNo: 3306 yapılandırmanızda farklı olabilir


Burada küçük bir düzeltme. Bağlantı özelliği 'useSSL' kabul edilebilir değerler şunlardır: 'TRUE', 'FALSE', 'YES' veya 'NO'. 'Yanlış' değeri; kabul edilemez.
bluelurker

12

Alternatif önerilen cevaplara denemek ve kullanabilirsiniz mysql_native_password kimlik doğrulama eklentisi yerine caching_sha2_password kimlik doğrulama eklentisi.

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password_here'; 

4

Spring boot çerçevesinde aşağıdaki yapılandırmayı kullanarak bu sorunu çözüyorum

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

1

Benim durumumda kullanıcı hatasıydı. rootKullanıcıyı geçersiz bir parola ile kullanıyordum . Neden bir kimlik doğrulama hatası almadığımdan emin değilim, bunun yerine bu şifreli mesajı aldım.


1

Benim durumumda yukarıdaki hata aslında yanlış kullanıcı adı ve şifreye bağlıydı. Sorunu çözme: 1. DriverManager.getConnection ("jdbc: mysql: // localhost: 3306 /? UseSSL = false", "username", "password") satırına gidin; Kullanıcı adı ve şifre alanları yanlış olabilir. Mysql istemcinizi başlatmak için kullandığınız kullanıcı adı ve parolayı girin. Kullanıcı adı genellikle root'tur ve şifre, buna benzer bir ekran mysql'nin Başlangıç ​​ekranı göründüğünde girdiğiniz dizedir .

Not: 3306 bağlantı noktası adı sizin durumunuzda farklı olabilir.


1

Bu sorunu sinir bozucu buldum çünkü dün veritabanıyla etkileşime girebildim, ancak bu sabah geri döndükten sonra bu hatayı almaya başladım.

allowPublicKeyRetrieval=trueBayrağı eklemeyi denedim ama hatayı almaya devam ettim.

Benim için düzelten şey Project->CleanEclipse'de ve CleanTomcat sunucumda yapmaktı. Bunlardan biri (veya her ikisi) onu düzeltti.

Nedenini anlamıyorum, çünkü projemi Maven kullanarak oluşturuyorum ve her kod değişikliğinden sonra sunucumu yeniden başlatıyorum. Çok rahatsız edici ...


1

Mysql ile ilkbahar önyükleme uygulaması bağlantısında useSSL = true değerini güncelleyin;

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

1

Mevcut uygulamamızı dockerize ederken de böyle bir sorunla karşılaşıyordum. JDBC bağlantı dizesine true değeriyle MySQL'in allowPublicKeyRetrieval bağlantı seçeneğini eklemenin çözümü si . Bu işe yaramazsa , useSSL seçeneğini de false olarak eklemeyi deneyin .

Ortaya çıkan dize şu şekilde görünecektir:

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

1

Öncelikle, lütfen Veritabanı sunucunuzun çalışır durumda olduğundan emin olun. Aynı hatayı alıyordum, burada listelenen tüm cevapları denedikten sonra Veritabanı sunucumun çalışmadığını öğrendim.

Aynısını MySQL Workbench veya Komut satırından kontrol edebilirsiniz.

mysql -u USERNAME -p

Bu apaçık görünüyor, ancak çoğu zaman Veritabanı sunucusunun her zaman çalışır durumda olduğunu varsayıyoruz, özellikle yerel makinemizde çalışırken, makineyi yeniden başlattığımızda / kapattığımızda, Veritabanı sunucusu otomatik olarak kapanacaktır.


0

Bu çözüm, MacOS Sierra için çalıştı ve MySQL 8.0.11 sürümünü çalıştırdı. Lütfen derleme yolunuza eklediğiniz sürücünün - "harici kavanoz ekle" nin SQL sürümüyle eşleştiğinden emin olun.

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

0

Bağlantı URL'sini jdbc: mysql: // localhost: 3306 / hb_student_tracker? AllowPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC olarak verin


0

Mysql'yi bağlarken aşağıdaki hatayı alıyorsanız (mysql'yi çalıştıran yerel veya mysql kapsayıcısı):

java.sql.SQLNonTransientConnectionException: Genel Anahtar Alımına izin verilmez

Çözüm: Veritabanı hizmetinize aşağıdaki satırı ekleyin:

command: --default-authentication-plugin=mysql_native_password

0

Bu, yanlış kullanıcı adı veya şifre nedeniyle de olabilir. Çözümler olarak allowPublicKeyRetrieval=true&useSSL=falseparça ekledim ama yine de hata aldım sonra şifreyi kontrol ettim ve yanlış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.