第一次连接未被访问过的MySql数据库报错 返回

SqlSugar 处理完成
8 1199
该叫什么 AGC66 发布于2024/1/30
悬赏:0 飞吻

现象:

    数据库服务器重启后,接口直接报错,如果使用Navicat连接检查时可以连上,接口又恢复正常了。

问题:

    连接字符串加上 SslMode=none 后使用SqlSugar连接Mysql时,如果Mysql从来没有被连接过会报错

 Authentication method 'caching_sha2_password' failed.Either use a secure connection,specify the server's RSA public key with ServerRSAPublicKeyFile, or set AllowPublicKeyPetrieval=True

    如果这时使用其他工具连接上数据库后(不用做任何操作,就是连接上)再次连接可以了。其中数据库 my.ini 没有配置任何SSL相关设置(默认),用户配置的是'caching_sha2_password'。


复现步骤:

  1.  重启Mysql服务后不要有任何连接去访问,这时使用带着SslMode=none的连接字符串去连接Mysql就会报错。

  2.  使用其他工具访问这个Mysql服务后再次连接,连接成功。


    如果去掉 SslMode=none 连接时本地可以连接成功,没有这个问题,但是发布后就会连不上数据库(因为数据库本身也没配置SSL)。


Mysql版本:8.30.0 及以上都行(其实8.2x好像也会)

SqlSugar版本: 5.1.4.86

.Net版本:.Net6

Mysql连接字符串: Data Source=服务器IP;Database=数据库名称;UserId=用户名;Password=密码;port=端口;SslMode=none;Connection Timeout=80;


我是使用以下方式注入全局的

图片.png

热忱回答8

  • fate sta fate sta VIP0
    2024/1/30

    注入前不要加open

    0 回复
  • fate sta fate sta VIP0
    2024/1/30

    Pooling=false; 

    字段串在加上这个试试

    0 回复
  • AGC66 AGC66 VIP0
    2024/1/30

    @fate sta:我在代码里去掉了 Open,加了Pooling=false但是问题还是存在,应该和这个没关系图片.png

    0 回复
  • fate sta fate sta VIP0
    2024/1/30

    @AGC66:另外把myqlconnector升级最新

    0 回复
  • fate sta fate sta VIP0
    2024/1/30

    还连不上就要自个原因了用new MyConnection(字符串).Open() 这个能连就行

    0 回复
  • AGC66 AGC66 VIP0
    2024/1/30

    @fate sta:使用 new MyConnection还是报这个错,应该是Mysql的问题,我再找找,感谢解答

    0 回复
  • AGC66 AGC66 VIP0
    2024/1/30

    原因:

      若仅配置SslMode=none,未配置AllowPublicKeyRetrieval=True时,当MySQL服务端应用用户认证缓存失效时,应用端可能会认证错误,此情况需确保数据库服务端应用用户认证缓存不失效(即在MySQL服务端应用用户缓存失效操作后,进行一次应用用户认证登录)。

    解决方案有三

    1. 连接字符串配置 AllowPublicKeyRetrieval=true;  及从服务端获取Key来解决第一次验证失效,可能会导致恶意代理通过中间人攻击(MITM)获取到明文密码,谨慎开启。

    2. 更改用户的验证方式为 mysql_native_password 。好像主从复制必须要 caching_sha2_password,可以考虑这种方案。

    3. 为服务器添加SSL证书(可以使用OpenSSL制作,AI有详情步骤),并在字符串中填写认证密钥 CertificatePassword=你的密钥 。


    0 回复
  • AGC66 AGC66 VIP0
    2024/1/30

    @AGC66:SslMode=none

    0 回复