web-dev-qa-db-fra.com

Connexion Java-MySql: la récupération de clé publique n'est pas autorisée

J'essaie de connecter la base de données MySql à Java à l'aide du connecteur 8.0.11. Tout semble aller pour le mieux mais j'ai cette exception:

Exception dans le thread "principal" Java.sql.SQLNonTransientConnectionException: La récupération de clé publique n'est pas autorisée

Trace de la pile:

    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)

Gestionnaire de connecteurs:

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

Vous devriez ajouter une option client à votre mysql-connector allowPublicKeyRetrieval=true 

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

pourrait aider aussi en ajoutant useSSL=false

77
jtomaszk

Utilisez jdbc url comme:

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

PortNo: 3306 peut être différent dans votre configuration

8
susan097

Je résous ce problème en utilisant la configuration ci-dessous sur la structure de démarrage à ressort

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
2
shellhub

Vous pouvez également utiliser mysql_native_password authentication plugin au lieu de caching_sha2_password authentication plugin.

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

Dans mon cas, c'était une erreur de l'utilisateur. J'utilisais l'utilisateur root avec un mot de passe invalide. Je ne sais pas pourquoi je n'ai pas d'erreur d'authentification mais reçu ce message crypté.

1
juice

Cette solution fonctionnait sous MacOS Sierra et fonctionnait sous MySQL version 8.0.11. Assurez-vous que le pilote que vous avez ajouté dans votre chemin de construction - "add external jar" doit correspondre à la version SQL.

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

L’erreur ci-dessus dans mon cas était en fait due à un nom d’utilisateur et un mot de passe incorrects . Résolution du problème: 1. Allez à la ligne DriverManager.getConnection ("jdbc: mysql: // localhost: 3306 /? UseSSL = false", "nom d'utilisateur", "mot de passe"); Les champs nom d'utilisateur et mot de passe peuvent être incorrects. Entrez le nom d'utilisateur et le mot de passe que vous utilisez pour démarrer votre client mysql. Le nom d'utilisateur est généralement root et password est la chaîne que vous entrez quand un écran similaire à celui-ci apparaît Ecran de démarrage de mysql

Remarque: Le nom du port 3306 peut être différent dans votre cas.

0
HARSHIT KUMAR

J'ai trouvé ce problème frustrant parce que j'ai pu interagir avec la base de données hier, mais après être revenu ce matin, j'ai commencé à avoir cette erreur.

J'ai essayé d'ajouter le drapeau allowPublicKeyRetrieval=true, mais j'ai continué à avoir l'erreur.

Ce qui a résolu le problème pour moi, c'est de faire Project->Clean dans Eclipse et Clean sur mon serveur Tomcat. Un (ou les deux) de ceux qui l'ont corrigé.

Je ne comprends pas pourquoi, parce que je construis mon projet avec Maven et que je redémarre mon serveur après chaque changement de code. Très irritant ...

0
Cameron Hudson