He estado usando WSO2 API Manager durante casi un año para exponer API de manera fácil y segura a consumidores internos y externos. Todo funcionaba bien hasta que se desactivó el sistema para realizar actividades de mantenimiento. Cuando el sistema se reanudó al servicio normal, WSO2 no pudo iniciarse con algunas excepciones en el wso2carbon.log
archivo – “Causado por:com.mysql.cj.exceptions.UnableToConnectException:no se permite la recuperación de clave pública”. En este artículo, compartiré la solución.
Error de recuperación de clave pública no permitida:WSO2 con MySQL 8.*
Además del error anterior, pude ver algunas excepciones más en wso2carbon.log
archivo, y aquí está la copia del mismo.
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
Mirando las primeras excepciones, entendí que el error se debe a la conexión de MySQL y la excepción causada en 'com.mysql.cj.jdbc.exceptions.SQLError ' lo confirma. El conector de MySQL parece tener algún problema y una búsqueda rápida en Google reveló que el problema se informó comúnmente en la versión 8 de MySQL.
El sistema parece haberse actualizado a la última versión de MySQL, es decir, la versión 8.0.26. Hace muy poco solucioné un par de problemas en la versión MySQL 8, en caso de que quieras echarle un vistazo. Ahora volviendo a este tema. La mayoría de los foros sugirieron agregar 'allowPublicKeyRetrieval=true'
a la URL de conexión de MySQL y también funcionó.
En WSO2, agregue 'allowPublicKeyRetrieval=true
‘ al deployment.toml
archivo como se muestra a continuación:
[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 :el &
; antes de allowPublicKeyRetrieval=true
en la URL de conexión. Agregar solo '&' en lugar de '&' daría como resultado el siguiente error:
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 vez realizados los cambios, reinicie el servicio WSO. ¡Eso es!
La opción allowPublicKeyRetrieval=true
permite al cliente solicitar automáticamente la clave pública del servidor. Lea más sobre las opciones de MySQL aquí.
Si está ejecutando WSO2 en un servidor de producción, no se recomienda useSSL=false. allowPublicKeyRetrieval=True
podría permitir un ataque man-in-the-middle a través de un proxy malicioso para obtener la contraseña de texto sin formato. allowPublicKeyRetrieval es False de forma predeterminada y debe habilitarse explícitamente. Si utiliza una conexión segura a la base de datos, intente eliminar useSSL=false de la URL de conexión y eso podría solucionar el problema.