Ich verwende den WSO2 API Manager seit fast einem Jahr, um APIs einfach und sicher sowohl internen als auch externen Verbrauchern zugänglich zu machen. Alles funktionierte einwandfrei, bis das System für Wartungsarbeiten abgeschaltet wurde. Als das System wieder in den normalen Betrieb zurückversetzt wurde, konnte WSO2 mit einigen Ausnahmen in wso2carbon.log
nicht gestartet werden Datei – „Verursacht durch:com.mysql.cj.exceptions.UnableToConnectException:Public Key Retrieval ist nicht zulässig“. In diesem Artikel teile ich die Fehlerbehebung.
Fehler Abruf des öffentlichen Schlüssels ist nicht zulässig – WSO2 mit MySQL 8.*
Abgesehen von dem obigen Fehler konnte ich noch ein paar weitere Ausnahmen in der wso2carbon.log
sehen Datei, und hier ist die Kopie davon.
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
Wenn ich mir die ersten paar Ausnahmen ansehe, habe ich verstanden, dass der Fehler auf eine MySQL-Verbindung und eine Ausnahme zurückzuführen ist, die bei „com.mysql.cj.jdbc.exceptions.SQLError“ verursacht wurde “ bestätigt es. Der MySQL-Connector scheint ein Problem zu haben und eine schnelle Suche in Google ergab, dass das Problem häufig in MySQL-Version 8 gemeldet wurde.
Das System scheint auf die neueste Version von MySQL aktualisiert worden zu sein, d. h. Version 8.0.26. Vor kurzem hatte ich ein paar Probleme in der MySQL 8-Version behoben, falls Sie einen Blick darauf werfen möchten. Kommen wir nun zu diesem Thema zurück. Die meisten Foren schlugen vor, 'allowPublicKeyRetrieval=true'
hinzuzufügen an die MySQL-Verbindungs-URL und es hat auch funktioniert.
Fügen Sie in WSO2 „allowPublicKeyRetrieval=true
hinzu ‘ zur deployment.toml
Datei wie unten gezeigt:
[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" ........................
Hinweis :der &
; vor allowPublicKeyRetrieval=true
in der Verbindungs-URL. Das Hinzufügen von nur „&“ anstelle von „&“ würde zu folgendem Fehler führen:
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].kann nicht gefunden werden
Sobald die Änderungen vorgenommen wurden, starten Sie den WSO-Dienst neu. Das ist es!
Die Option allowPublicKeyRetrieval=true
ermöglicht es dem Client, den öffentlichen Schlüssel automatisch vom Server anzufordern. Lesen Sie hier mehr über die MySQL-Optionen.
Wenn Sie WSO2 auf einem Produktionsserver ausführen, wird useSSL=false nicht empfohlen. allowPublicKeyRetrieval=True
könnte einen Man-in-the-Middle-Angriff über einen böswilligen Proxy ermöglichen, um das Klartext-Passwort zu erhalten. allowPublicKeyRetrieval ist standardmäßig False und muss explizit aktiviert werden. Wenn Sie eine gesicherte Verbindung zur Datenbank verwenden, versuchen Sie, useSSL=false aus der Verbindungs-URL zu entfernen. Dadurch könnte das Problem behoben werden.