Již téměř rok používám WSO2 API Manager ke snadnému a bezpečnému vystavení API interním i externím spotřebitelům. Vše fungovalo dobře, dokud nebyl systém odstaven z důvodu údržby. Když byl systém obnoven zpět do normálního provozu, WSO2 se nepodařilo spustit s několika výjimkami v wso2carbon.log
soubor – „Způsobeno:com.mysql.cj.exceptions.UnableToConnectException:Načítání veřejného klíče není povoleno.“ V tomto článku se podělím o opravu.
Chyba načítání veřejného klíče není povoleno – WSO2 s MySQL 8.*
Kromě výše uvedené chyby jsem v wso2carbon.log
viděl několik dalších výjimek a zde je jeho kopie.
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
Když jsem se podíval na několik prvních výjimek, pochopil jsem, že chyba je způsobena připojením MySQL a výjimkou způsobenou na adrese „com.mysql.cj.jdbc.exceptions.SQLError ‘ potvrzuje to. Zdá se, že konektor MySQL má nějaký problém a rychlé vyhledávání na Googlu odhalilo, že problém byl běžně hlášen v MySQL verze 8.
Zdá se, že systém byl aktualizován na nejnovější verzi MySQL, tj. verzi 8.0.26. Nedávno jsem opravil několik problémů ve verzi MySQL 8, pro případ, že byste se na to chtěli podívat. Nyní se vraťme k této problematice. Většina fór navrhla přidat 'allowPublicKeyRetrieval=true'
na adresu URL připojení MySQL a fungovalo to také.
Ve WSO2 přidejte ‘allowPublicKeyRetrieval=true
‘ do deployment.toml
soubor, jak je uvedeno níže:
[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" ........................."
Poznámka :&
; před allowPublicKeyRetrieval=true
v adrese URL připojení. Přidání pouze „&“ místo „&“ by vedlo k níže uvedené chybě:
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].
Po provedení změn restartujte službu WSO. To je ono!
Možnost allowPublicKeyRetrieval=true
umožňuje klientovi automaticky požadovat veřejný klíč ze serveru. Přečtěte si více o možnostech MySQL zde.
Pokud používáte WSO2 na produkčním serveru, useSSL=false se nedoporučuje. allowPublicKeyRetrieval=True
by mohl umožnit útok typu man-in-the-middle prostřednictvím škodlivého proxy, aby získal heslo ve formátu prostého textu. allowPublicKeyRetrieval je ve výchozím nastavení False a musí být explicitně povoleno. Pokud používáte zabezpečené připojení k databázi, zkuste z adresy URL připojení odstranit useSSL=false a to by mohlo problém vyřešit.