MySQL: The server requested authentication method unknown to the client [caching_sha2_password]

El siguiente error de caching_sha2_password plugin se puede presentar al establecer una conexión con PHP (mysqli) a un servidor MySQL versión 8:

Warning: mysqli_real_connect(): The server requested authentication method unknown to the client [caching_sha2_password] in /var/www/...

Warning: mysqli_real_connect(): (HY000/2054): The server requested authentication method unknown to the client in ...

The server requested authentication method unknown to the client

El problema es que MySQLi de PHP todavía no tiene soporte para caching_sha2_password, así que toca volver al plugin anterior. Es una pena ya que caching_sha2_password mejora notablemente la seguridad e integridad del almacenamiento y uso de contraseñas en MySQL.

Si usáis wordpress, no veréis un error tan detallado a no ser que habilitéis el DEBUG a nivel de wp-config.php:

//define( 'WP_DEBUG', true );

El error que veréis sin debug es simplemente: Error establishing a Database connection o Error estableciendo una conexión con la base de datos.

El origen del problema es un fallo de retrocompatibilidad, es decir, clientes de MySQL no tan modernos, más antiguos que la versión de MySQL no pueden usar el plugin de autenticación activo. Como es algo bastante común, MySQL ya deja la siguiente información comentada en el archivo de configuración /etc/my.cnf:

[mysqld]
[...]
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
#default-authentication-plugin=mysql_native_password

Así que la solución es sencilla, configuramos que el plugin de autenticación por defecto sea mysql_native_password:

[mysqld]
[...]
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
default-authentication-plugin=mysql_native_password

Tras reiniciar MySQL, el funcionamiento debería ser correcto. Eso sí, tened en cuenta que si los usuarios los habéis creado antes de cambiar el plugin de autenticación, probablemente siga fallando, simplemente volved a regenerar los usuarios.

CREATE USER 'X'@'localhost' IDENTIFIED BY 'X-';
GRANT XX ON X.* TO 'X'@'localhost';