Uso WSO2 API Manager da quasi un anno per esporre le API in modo facile e sicuro a consumatori interni ed esterni. Tutto ha funzionato bene fino a quando il sistema non è stato disattivato per attività di manutenzione. Quando il sistema è stato ripreso al servizio normale, WSO2 non è stato avviato con alcune eccezioni nel wso2carbon.log
file – "Causato da:com.mysql.cj.exceptions.UnableToConnectException:il recupero della chiave pubblica non è consentito". In questo articolo condividerò la correzione.
Il recupero della chiave pubblica di errore non è consentito – WSO2 con MySQL 8.*
A parte l'errore di cui sopra, potrei vedere alcune altre eccezioni in wso2carbon.log
file, ed eccone una copia.
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
Osservando le prime eccezioni, ho capito che l'errore è dovuto alla connessione MySQL e all'eccezione causata da "com.mysql.cj.jdbc.exceptions.SQLError ' lo conferma. Il connettore MySQL sembra avere qualche problema e una rapida ricerca su Google ha rivelato che il problema veniva comunemente segnalato in MySQL versione 8.
Il sistema sembra essere aggiornato all'ultima versione di MySQL, ovvero la versione 8.0.26. Molto recentemente ho risolto un paio di problemi nella versione MySQL 8, nel caso in cui volessi dargli un'occhiata. Ora tornando su questo problema. La maggior parte dei forum ha suggerito di aggiungere 'allowPublicKeyRetrieval=true'
all'URL di connessione MySQL e ha funzionato ugualmente.
In WSO2, aggiungi "allowPublicKeyRetrieval=true
' al deployment.toml
file come mostrato di seguito:
[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" ........................
Nota :il &
; prima di allowPublicKeyRetrieval=true
nell'URL di connessione. L'aggiunta di solo "&" invece di "&" comporterebbe il seguente errore:
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].
Una volta apportate le modifiche, riavviare il servizio WSO. Questo è tutto!
L'opzione allowPublicKeyRetrieval=true
consente al client di richiedere automaticamente la chiave pubblica dal server. Leggi di più sulle opzioni MySQL qui.
Se stai eseguendo WSO2 su un server di produzione, useSSL=false non è consigliato. allowPublicKeyRetrieval=True
potrebbe consentire l'attacco man-in-the-middle tramite proxy dannoso per ottenere la password in chiaro. allowPublicKeyRetrieval è False per impostazione predefinita e deve essere abilitato in modo esplicito. Se utilizzi una connessione protetta al database, prova a rimuovere useSSL=false dall'URL di connessione e ciò potrebbe risolvere il problema.