J'essaye de connecter la base de données MySql avec Java en utilisant le connecteur 8.0.11. Tout semble aller bien mais j'ai cette exception:
Exception dans le thread "main" 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();
}
}
Réponses:
Vous devez ajouter une option client à votre connecteur mysql
allowPublicKeyRetrieval=true
pour permettre au client de demander automatiquement la clé publique au serveur. Notez que celaAllowPublicKeyRetrieval=True
pourrait permettre à un proxy malveillant d'effectuer une attaque MITM pour obtenir le mot de passe en clair, il est donc False par défaut et doit être explicitement activé.https://mysql-net.github.io/MySqlConnector/connection-options/
vous pouvez également essayer d'ajouter
useSSL=false
lorsque vous l'utilisez à des fins de test / développementexemple:
la source
useSSL=false&allowPublicKeyRetrieval=true
est ce dont j'avais besoin uniquement lorsque j'ai essayé de me connecter dedocker_container1
àdocker_container2_mysql(where mysql is installed)
au sein de mon hôte local. Alors que de ma machine hôte àdocker_container2_mysql
,useSSL=false
c'est suffisant.Utiliser
jdbc url
comme:PortNo: 3306
peut être différent dans votre configurationla source
Pour les utilisateurs de DBeaver :
Faites un clic droit sur votre connexion, choisissez "Modifier la connexion"
Sur l'écran "Paramètres de connexion" (écran principal), cliquez sur "Modifier les paramètres du pilote"
Cliquez sur "Propriétés de la connexion"
Cliquez avec le bouton droit de la souris sur la zone "Propriétés de l'utilisateur" et choisissez "Ajouter une nouvelle propriété"
Ajoutez deux propriétés: "useSSL" et "allowPublicKeyRetrieval"
Définissez leurs valeurs sur "faux" et "vrai" en double-cliquant sur la colonne "valeur"
la source
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 .
la source
Je résolve ce problème en utilisant la configuration ci-dessous sur le framework Spring Boot
la source
Dans mon cas, c'était une erreur de l'utilisateur. J'utilisais l'
root
utilisateur avec un mot de passe invalide. Je ne sais pas pourquoi je n'ai pas eu d'erreur d'authentification, mais j'ai reçu ce message cryptique.la source
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. Accédez à la ligne DriverManager.getConnection ("jdbc: mysql: // localhost: 3306 /? UseSSL = false", "username", "password"); 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 le mot de passe est la chaîne que vous entrez lorsqu'un écran similaire à celui-ci apparaît Écran de démarrage de mysql
Remarque: le nom du port 3306 peut être différent dans votre cas.
la source
J'ai trouvé ce problème frustrant car j'ai pu interagir avec la base de données hier, mais après être revenu ce matin, j'ai commencé à recevoir cette erreur.
J'ai essayé d'ajouter le
allowPublicKeyRetrieval=true
drapeau, mais j'ai continué à recevoir l'erreur.Ce qui a résolu le problème pour moi était de faire
Project->Clean
dans Eclipse etClean
sur mon serveur Tomcat. Un (ou les deux) de ceux-ci l'ont corrigé.Je ne comprends pas pourquoi, parce que je construis mon projet avec Maven et que j'ai redémarré mon serveur après chaque changement de code. Très irritant ...
la source
Mettez à jour useSSL = true dans la connexion de l'application Spring Boot avec mysql;
la source
J'étais également confronté à un tel problème lors de l'ancrage de notre application existante. La solution consiste à ajouter l' option de connexion allowPublicKeyRetrieval de MySQL avec une valeur true à la chaîne de connexion JDBC. Si cela ne fonctionne pas, essayez d'ajouter l' option useSSL à false .
La chaîne résultante ressemblerait à ceci:
la source
Cette solution fonctionnait pour MacOS Sierra et exécutait MySQL version 8.0.11. Veuillez vous assurer que le pilote que vous avez ajouté dans votre chemin de construction - "ajouter un fichier jar externe" doit correspondre à la version SQL.
la source
Donnez l'URL de connexion comme jdbc: mysql: // localhost: 3306 / hb_student_tracker? AllowPublicKeyRetrieval = true & useSSL = false & serverTimezone = UTC
la source
Si vous obtenez l'erreur suivante lors de la connexion de mysql (conteneur local ou mysql exécutant le mysql):
java.sql.SQLNonTransientConnectionException: la récupération de clé publique n'est pas autorisée
Solution: ajoutez la ligne suivante dans votre service de base de données:
la source
Tout d'abord, assurez-vous que votre serveur de base de données est opérationnel. J'obtenais la même erreur, après avoir essayé toutes les réponses énumérées ici, j'ai découvert que mon serveur de base de données ne fonctionnait pas.
Vous pouvez vérifier la même chose depuis MySQL Workbench ou la ligne de commande en utilisant
Cela semble évident, mais nous supposons souvent que le serveur de base de données est opérationnel tout le temps, en particulier lorsque nous travaillons sur notre machine locale, lorsque nous redémarrons / éteignons la machine, le serveur de base de données sera automatiquement arrêté.
la source
Cela peut également être dû à un nom d'utilisateur ou un mot de passe incorrect. En tant que solutions, j'ai ajouté une
allowPublicKeyRetrieval=true&useSSL=false
partie mais j'ai toujours une erreur, puis j'ai vérifié le mot de passe et c'était faux.la source