J'utilise WSO2 API Manager depuis près d'un an pour exposer facilement et en toute sécurité les API aux consommateurs internes et externes. Tout fonctionnait bien jusqu'à ce que le système soit retiré pour des activités de maintenance. Lorsque le système a été remis en service normal, WSO2 n'a pas pu démarrer avec quelques exceptions dans le wso2carbon.log
file - "Causé par :com.mysql.cj.exceptions.UnableToConnectException :la récupération de la clé publique n'est pas autorisée". Dans cet article, je vais partager le correctif.
Erreur La récupération de la clé publique n'est pas autorisée – WSO2 avec MySQL 8.*
Outre l'erreur ci-dessus, j'ai pu voir quelques exceptions supplémentaires dans le wso2carbon.log
fichier, et en voici la copie.
ERROR {org.wso2.carbon.user.core.internal.Activator} - Cannot start User Manager Core bundle org.wso2.carbon.user.core.UserStoreException: Cannot initialize the realm. at org.wso2.carbon.user.core.common.DefaultRealmService.initializeRealm(DefaultRealmService.java:286) at org.wso2.carbon.user.core.common.DefaultRealmService.<init>(DefaultRealmService.java:102) ::::::::::::::::::::::::::::::::::::::::::::::::: Caused by: java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) at ::::::::::::::::::::::::::::::::::::::::::: ERROR {org.wso2.carbon.user.core.internal.Activator} - Cannot start User Manager Core bundle org.wso2.carbon.user.core.UserStoreException: Cannot initialize the realm. at org.wso2.carbon.user.core.common.DefaultRealmService.initializeRealm(DefaultRealmService.java:286) :::::::::::::::::::::::::::::::::::::::::: Caused by: org.wso2.carbon.user.core.UserStoreException: DB error occurred while persisting domain : PRIMARY & tenant id : -1234
En regardant les premières exceptions, j'ai compris que l'erreur est due à la connexion MySQL et à l'exception causée à 'com.mysql.cj.jdbc.exceptions.SQLError ' le confirme. Le connecteur MySQL semble avoir un problème et une recherche rapide dans Google a révélé que le problème était couramment signalé dans MySQL version 8.
Le système semble avoir été mis à jour vers la dernière version de MySQL, c'est-à-dire la version 8.0.26. Très récemment, j'ai corrigé quelques problèmes dans la version MySQL 8, au cas où vous voudriez y jeter un coup d'œil. Revenons maintenant à cette question. La plupart des forums ont suggéré d'ajouter 'allowPublicKeyRetrieval=true'
à l'URL de connexion MySQL et cela a également fonctionné.
Dans WSO2, ajoutez 'allowPublicKeyRetrieval=true
‘ au deployment.toml
fichier comme indiqué ci-dessous :
[database.apim_db] type = "mysql" #Henry - Retain mysql connnection string as localhost always url = "jdbc:mysql://localhost:3306/apim_db?useSSL=false&allowPublicKeyRetrieval=true" ............. [database.shared_db] type = "mysql" #Henry - Retain mysql connnection string as localhost always url = "jdbc:mysql://localhost:3306/shared_db?useSSL=false&allowPublicKeyRetrieval=true" ........................
Remarque :le &
; avant allowPublicKeyRetrieval=true
dans l'URL de connexion. L'ajout de "&" au lieu de "&" entraînerait l'erreur ci-dessous :
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '=' (code 61); expected a semi-colon after the reference for entity 'allowPublicKeyRetrieval' at [row,col {unknown-source}]: [39,100] ERROR {org.wso2.carbon.user.core.internal.Activator} - Cannot start User Manager Core bundle java.lang.RuntimeException: Error in looking up data source: Name [jdbc/SHARED_DB] is not bound in this Context. Unable to find [jdbc].
Une fois les modifications apportées, redémarrez le service WSO. C'est tout !
L'option allowPublicKeyRetrieval=true
permet au client de demander automatiquement la clé publique au serveur. En savoir plus sur les options MySQL ici.
Si vous exécutez WSO2 sur un serveur de production, useSSL=false n'est pas recommandé. allowPublicKeyRetrieval=True
pourrait permettre à une attaque de l'homme du milieu via un proxy malveillant d'obtenir le mot de passe en clair. allowPublicKeyRetrieval a la valeur False par défaut et doit être explicitement activé. Si vous utilisez une connexion sécurisée à la base de données, essayez de supprimer useSSL=false de l'URL de connexion et cela pourrait résoudre le problème.