返回

解决RubyMine无法连接MySQL 8 (caching_sha2_password)

mysql

RubyMine 无法通过 caching_sha2_password 连接到 MySQL 8:问题排查与解决

在使用 RubyMine 连接 MySQL 8 数据库,且用户认证方式为 caching_sha2_password 时,可能会遇到连接失败的问题。 这是因为 RubyMine (或其他一些客户端) 可能还依赖于较旧的、已被弃用的 mysql_native_password 认证插件。 这篇帖子就来聊聊如何解决这个问题, 以及如何确定 MySQL 用户的认证方式。

一、 问题原因: 认证插件的变迁

MySQL 8 引入了 caching_sha2_password 作为默认的身份验证插件,它比之前版本默认使用的 mysql_native_password 更加安全。 问题就出在这里:较老的客户端,包括一些版本的 RubyMine 使用的数据库连接库,可能尚未完全支持 caching_sha2_password,还尝试使用 mysql_native_password 进行连接。 结果自然是连不上。

此外,如果服务器端完全禁用了mysql_native_password, 那么这种不兼容将导致连接必然失败。

要搞清楚当前用户的认证方式,可以通过如下的SQL查询来实现:

SELECT user, host, plugin FROM mysql.user;

这个查询语句会列出所有的MySQL用户,包括他们对应的 host 以及当前使用的 plugin (也就是身份验证插件)。 从这个列表里,我们就能轻松识别出谁在用caching_sha2_password,谁在用 mysql_native_password。 假设我们创建了如下两个用户:

CREATE USER IF NOT EXISTS 'rachel' IDENTIFIED WITH mysql_native_password BY 'super_secure_password';

CREATE USER IF NOT EXISTS 'bob' IDENTIFIED WITH caching_sha2_password BY 'amazing_password';

执行以上SELECT语句,就能从plugin列看到他们的认证插件差异。

二、 解决方法

针对这个问题,有几种不同的解决方案,可以根据具体情况选择:

1. 更改用户认证插件 (推荐)

这是最直接的方法。 把用户的认证插件改成 mysql_native_password,这样客户端就能用它习惯的方式连接了。但请注意,这个方式相对来说安全性较低,所以尽量只作为临时解决方案,或在确定客户端都支持 caching_sha2_password 的内部开发环境使用

操作步骤:

  1. 使用管理员权限登录 MySQL:

    mysql -u root -p
    
  2. 更改指定用户的认证插件:

    将下面命令中的 'bob' 替换成实际用户名,'amazing_password' 替换成用户的实际密码:

    ALTER USER 'bob'@'localhost' IDENTIFIED WITH mysql_native_password BY 'amazing_password';
    
    • 'bob'@'localhost': 指定要修改的用户和主机。localhost 表示只允许从本地连接。 如果需要从其他主机连接,请将 localhost 替换为相应的主机名或 IP 地址,或者使用 % 允许所有主机。
    • IDENTIFIED WITH mysql_native_password:指定使用 mysql_native_password 插件。
    • BY 'amazing_password':设置用户密码,请确保使用安全的密码。
  3. 刷新权限:

    FLUSH PRIVILEGES;
    
  4. 重连测试。

2. 升级 RubyMine 的 JDBC 驱动

较新版本的 JDBC 驱动通常已经支持 caching_sha2_password。 如果有新版本可用,更新驱动可能就能直接解决问题。

操作步骤:

  1. 打开 RubyMine 的数据库配置窗口: 找到连接失败的那个数据库配置。

  2. 找到 Driver 选项: 一般会有一个下拉框,可以选择不同的驱动版本。

  3. 尝试选择最新的 MySQL Connector/J 版本: 通常可以直接在列表中找到。 如果找不到,可能需要手动下载。

  4. 手动下载并添加 (如果需要):

    • 去 MySQL 官网下载 Connector/J 的最新版 (JAR 文件)。
    • 在 RubyMine 的驱动设置里,找到 “Add Custom JARs” 或类似的选项,把下载的 JAR 文件添加进去。
    • 然后在驱动版本列表中选择你添加的JAR包。
  5. 重新测试连接。

3. 在连接 URL 中指定认证插件 (不完全可靠)

有些情况下,可以在数据库连接的 URL 里添加参数,强制使用 caching_sha2_password。这种方法的可靠性取决于驱动的具体实现,不一定所有情况下都有效。

操作步骤:

  1. 打开 RubyMine 的数据库配置窗口。

  2. 找到连接 URL (JDBC URL): 通常会是一个类似 jdbc:mysql://localhost:3306/your_database 的字符串。

  3. 在 URL 中添加参数:

    • 对于 caching_sha2_password, 可以试试加上 ?defaultAuthenticationPlugin=caching_sha2_password
      完整URL类似: jdbc:mysql://localhost:3306/your_database?defaultAuthenticationPlugin=caching_sha2_password
    • 对于有些驱动版本或老版本服务器强制使用mysql_native_password的情况, 可以试试加上?defaultAuthenticationPlugin=mysql_native_password&useSSL=false
  4. 保存配置并测试连接。

4. MySQL 服务器端调整 (可选,非必须)

这种方法针对的是客户端支持 caching_sha2_password, 但默认发送 mysql_native_password 连接请求导致首次认证失败的情况。通过在服务器端启用兼容选项,可以让服务器在遇到旧的mysql_native_password初始请求后,允许客户端通过发送 caching_sha2_password 格式的密码继续进行验证,而不需要修改客户端配置或者用户本身的身份验证插件。

操作步骤(以 Linux 系统为例,修改 MySQL 配置文件):

  1. 编辑 MySQL 配置文件:
    通常位于 /etc/mysql/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf。使用root权限或sudo编辑.

  2. [mysqld] 部分添加配置:
    添加或修改 default_authentication_plugin,以及可能需要的 caching_sha2_password_auto_generate_rsa_keysget_server_public_key:

    [mysqld]
    default_authentication_plugin=caching_sha2_password
    caching_sha2_password_auto_generate_rsa_keys=ON  # 自动生成RSA密钥对
    

    get_server_public_key 选项的开启方式跟具体的mysql connector 和 驱动版本强相关,可能需要自行测试决定. 一般客户端没有显式设置此选项。

  3. 针对8.0.18以前版本 : 老版本, 例如 MySQL 8.0.4 到8.0.11 的某些早期版本,行为有所不同,需要手动生成 RSA 密钥对。生成和配置密钥的过程需要特别注意:

    • 使用openssl生成公私钥,配置目录通常为/var/lib/mysql
     sudo openssl genrsa -out /var/lib/mysql/private_key.pem 2048
     sudo openssl rsa -in /var/lib/mysql/private_key.pem -pubout -out /var/lib/mysql/public_key.pem
     sudo chown mysql:mysql /var/lib/mysql/private_key.pem
     sudo chown mysql:mysql /var/lib/mysql/public_key.pem
     sudo chmod 600 /var/lib/mysql/private_key.pem
     sudo chmod 644 /var/lib/mysql/public_key.pem
    

    然后在配置文件中明确指定:

    [mysqld]
    default_authentication_plugin=caching_sha2_password
    caching_sha2_password_private_key_path=/var/lib/mysql/private_key.pem
    caching_sha2_password_public_key_path=/var/lib/mysql/public_key.pem
    
  4. 重启 MySQL 服务:
    使得更改的配置生效:

    sudo systemctl restart mysql
    

    或者

    sudo service mysql restart
    
  5. 客户端侧测试

重启 MySQL 服务之后,使用RubyMine或任何其他的数据库客户端测试与服务器之间的连接。

安全性建议:

  • 密钥文件保护: 无论自动生成还是手动生成,保证密钥文件的安全至关重要。确保只有MySQL服务用户具有对密钥文件的访问权限。
  • 客户端连接 : 如果配置了 caching_sha2_password 并且环境允许,应强制使用安全连接(SSL/TLS)。

5. 使用 SSH 隧道 (适用于远程连接)

如果 RubyMine 位于远程机器, 可以通过 SSH 隧道建立一个安全的连接, 将本地端口转发到 MySQL 服务器,然后使用 RubyMine 的本地连接方式连接到 MySQL 数据库,规避认证插件的问题。

操作步骤

  1. 建立 SSH 隧道:
    在本地计算机上执行如下命令:

    ssh -L 3307:localhost:3306 user@mysql_server_ip -N
    
    • -L 3307:localhost:3306: 将本地的 3307 端口转发到 mysql_server_ip 上的 localhost:3306 (即 MySQL 服务器)。
    • user:在 MySQL 服务器上的用户名。
    • mysql_server_ip: MySQL服务器IP地址。
    • -N: 表示仅做转发,不需要打开远程 shell。
  2. ** RubyMine 中使用本地连接:**
    在 RubyMine 的数据库配置中:

    • Host : localhost 或者 127.0.0.1
    • Port : 3307 (上一步指定的本地端口).
    • User/Password : 输入你的 MySQL 数据库用户和密码。
    • 认证方式 : 这时候可以选择任意 RubyMine 支持的,因为实际的数据传输被安全的封装在了 SSH 隧道中。
  3. 保持 SSH 隧道开启: 连接成功后, 需要一直保持这个 SSH 命令运行, 这样本地端口 3307 才持续被转发到数据库服务.
    安全性提醒

  • 使用 SSH 隧道可以保护数据传输过程,确保了连接的安全性。
  • 如果要通过非安全网络 (如公网) 连接到 MySQL,强烈建议使用这种方式。

总结

根据不同的场景和需求,上面提到的5种方法能处理多数RubyMine 连接 MySQL 的问题。总的来说,推荐优先升级 JDBC 驱动或建立SSH隧道;如果只是用于临时开发测试,则可暂时修改认证插件,等客户端驱动跟上后及时改回。