392 votes

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 bien mais j'ai cette exception:

Exception dans le thread "principal" java.sql.SQLNonTransientConnectionException: la récupération de la 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();
    }
}
 

679voto

Warthel4578 Points 626

Vous devez ajouter l'option client à votre connecteur mysql allowPublicKeyRetrieval=true

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

pourrait également aider à ajouter useSSL=false

50voto

Sushant Points 558

Utilisez jdbc url comme:

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

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

26voto

Torsten Ojaperv Points 611

Alternativement aux réponses suggérées, vous pouvez essayer d'utiliser le plugin d'authentification mysql_native_password au lieu du plugin d'authentification caching_sha2_password .

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

7voto

shellhub Points 516

Je résous ce problème en utilisant la configuration ci-dessous sur le framework Spring Boot

 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
 

1voto

juice Points 1065

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X