vlambda博客
学习文章列表

连接mysql时报caching_sha2_password不支持怎么办

同事的windows服务器上的powershell脚本(实际使用的驱动是MySQL Connector/NET)访问新搭建的mysql 8.0实例时报caching_sha2_password不支持的错误。这是因为老的驱动不支持mysql 8.0新引入的caching_sha2_password认证方式导致的




    mysql 8.0引入了caching_sha2_password的认证方式,而且是默认的,该方式相对于mysql 5.7默认的mysql_native_password认证方式更加安全,该认证方式是在认证时基于公私钥对密码进行加解密

    先看看mysql8.0默认创建的用户认证信息:

mysql> select user,host,authentication_string,plugin from mysql.user where user='panda';+-------+------+------------------------------------------------------------------------+-----------------------+| user | host | authentication_string | plugin |+-------+------+------------------------------------------------------------------------+-----------------------+| panda | % | $A$005$!0kJ|A12u W/"'^rnXG/hJTMxYr5LiGEket1o8EYAE4AHSIholVhY/tng/5 | caching_sha2_password |+-------+------+------------------------------------------------------------------------+-----------------------+

    我对powershell及.net不熟,这里以java模拟一下现场:

客户端驱动版本:MySQL Connector/J 5.1.46

服务器端版本:MySQL 8.0.27

    与.net的程序报错一样,不支持caching_sha2_password

有一个简单有效的解决方式,就是把认证方式改为mysql_native_password认证方式,需要注意的是这样会影响用这个用户登录的所有程序

mysql> alter user panda@'%' identified with 'mysql_native_password' by '123456';Query OK, 0 rows affected (0.49 sec)
mysql> select user,host,authentication_string,plugin from mysql.user where user='panda';+-------+------+-------------------------------------------+-----------------------+| user | host | authentication_string | plugin |+-------+------+-------------------------------------------+-----------------------+| panda | % | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | mysql_native_password |+-------+------+-------------------------------------------+-----------------------+

    再跑一下程序看看效果:

连接mysql时报caching_sha2_password不支持怎么办

    解决是解决了,但是这样就失去了caching_sha2_password的优点,而且按照mysql的演进风格,mysql_native_password可能在未来推出舞台,我们得找到适应新的认证方式的解决办法。其实也很简单,升级驱动版本就行了

    按照官方这个链接https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-compatibility-issues的说法,MySQL Connector/J要升级到8.0.9+,MySQL Connector/NET要升级到8.0.10+。

连接mysql时报caching_sha2_password不支持怎么办

    实际上主版本低于8中稍高次版本的驱动也有支持caching_sha2_password认证方式的

    下面是MySQL Connector/J 5.1.46的更新说明,也就是说该版本开始支持

https://dev.mysql.com/doc/relnotes/connector-j/5.1/en/news-5-1-46.html

连接mysql时报caching_sha2_password不支持怎么办

    下面是MySQL Connector/NET 6.10.7的更新说明,也就是该版本开始支持https://dev.mysql.com/doc/relnotes/connector-net/en/news-6-10-7.html

连接mysql时报caching_sha2_password不支持怎么办

    下面我把java程序的驱动换成MySQL Connector/J 5.1.46来跑跑看,跑之前要把用户的认证方式改回caching_sha2_password

mysql> alter user panda@'%' identified with 'caching_sha2_password' by '123456';Query OK, 0 rows affected (0.44 sec)mysql> select user,host,authentication_string,plugin from mysql.user where user='panda';+-------+------+------------------------------------------------------------------------+-----------------------+| user | host | authentication_string | plugin |+-------+------+------------------------------------------------------------------------+-----------------------+| panda | % | $A$005$JL]7OWAQg`7+)+*1lWPqqbMhWZ4lYk0QKmo92R/st6MEkjJHRCVBAl8Wdzj3 | caching_sha2_password |+-------+------+------------------------------------------------------------------------+-----------------------+

    这里有个小改进:这里的caching_sha2_passwordauthentication_string与上面查到的是不是不一样,这样相同的密码存储在mysql中authentication_string不一定一样,这样增加了一点安全性

    下面正式跑一下程序,没有报错:

连接mysql时报caching_sha2_password不支持怎么办

    扩展说一点——已经与认证插件无关了——看到输出框里红色的警告信息没有,我这里把它贴在下面

Sun Jan 02 21:54:22 CST 2022 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=falseor set useSSL=true and provide truststore for server certificate verification.

    这里只是警告,不影响连接建立,但是按照mysql的演进风格未来就可能变成error阻止连接建立了。这里可以得到两点有用的信息:

  1. 高版本的mysql如果不设置相应参数会建立ssl加密连接,有些基于网络抓包来做mysql审计的软件要注意了;

    连接mysql时报caching_sha2_password不支持怎么办

  2. 要想屏蔽这个warning,最好显示的指定要不要加密,不加密就在连接字符串上设置useSSL=false,加密就设置useSSL=true并指定truststore(其实可以不指定truststore,设置verifyServerCertificate=false即可)

    下面两张图演示useSSL=false情况,输出框已无警告且连接未加密

连接mysql时报caching_sha2_password不支持怎么办

连接mysql时报caching_sha2_password不支持怎么办

    下面两张图演示useSSL=true&verifyServerCertificate=false的情况,输出框警告连接是加密的,verifyServerCertificate=false的意思是不验证服务器证书

    至于怎么设置truststore,有点小复杂,还需要制作truststore文件,启动java程序时需要带相应参数,参考这个链接:https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-using-ssl.html