You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器内的Unity服务器连接同Linux虚拟机上的MySQL时出现CryptographicException: Chain instance is empty错误

Docker容器内的Unity服务器连接同Linux虚拟机上的MySQL时出现CryptographicException: Chain instance is empty错误

看起来你遇到的这个SSL握手失败的问题,我之前帮朋友排查过类似的情况,大概率是容器内Mono运行时的SSL证书验证和MySQL的SSL配置不兼容导致的,结合你的场景,给你几个可以一步步测试的解决方案:

1. 先禁用SSL连接测试(快速验证)

你的报错信息里明确提到了CryptographicException: Chain instance is empty,这是Mono在尝试验证MySQL的SSL证书时找不到可信根证书导致的。最快的测试方法是在连接字符串里强制关闭SSL验证:

修改你的connectionString,添加SslMode=None;参数:

string connectionString = "Server=127.0.0.1;" + 
                          "Database=unity_data;" + 
                          "UserID=unity;" + 
                          "Password=<your_password>;" + 
                          "Pooling=false;" + 
                          "SslMode=None;";

然后重新打包容器测试,如果dbcon.Open()能成功走到Debug.Log("4"),那基本可以确定是SSL验证的问题。

2. 确认MySQL用户与网络配置

虽然你用了--network host让容器共享宿主机网络,但还是要再检查两个点:

  • 确认MySQL的bind-address配置:打开宿主机的MySQL配置文件(通常是/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),查看bind-address是否设置为127.0.0.1或0.0.0.0(如果要允许外部访问的话),确保宿主机本地能正常连接。
  • 确认用户权限:登录宿主机的MySQL,执行SELECT user, host FROM mysql.user WHERE user='unity';,确认unity用户的host是127.0.0.1,和你连接字符串里的Server地址匹配;同理unity2@localhost对应的是socket连接,你可以在连接字符串里把Server改成localhost同时去掉SslMode=None试试socket连接是否能绕开SSL问题。

3. 容器内安装根证书(如果需要保留SSL)

如果你的MySQL必须开启SSL连接,那需要让容器内的Mono运行时信任MySQL的SSL证书:

  1. 找到宿主机MySQL的SSL证书位置,通常在/etc/mysql/ssl/目录下(包含ca.pem、server-cert.pem等文件)。
  2. 在启动容器时,把证书目录挂载到容器内,比如修改docker run命令:
    docker run --network host -v /etc/mysql/ssl:/container/mysql-ssl -p 7777:7777/udp private_repository_name:tag_name
    
  3. 修改Unity的连接字符串,指定证书路径:
    string connectionString = "Server=127.0.0.1;" + 
                              "Database=unity_data;" + 
                              "UserID=unity;" + 
                              "Password=<your_password>;" + 
                              "Pooling=false;" + 
                              "SslMode=Required;" + 
                              "SslCa=/container/mysql-ssl/ca.pem;";
    

4. 用命令行排查连接问题

为了排除Unity代码的问题,你可以在容器内安装MySQL客户端,直接测试连接:

  1. 进入运行中的容器:docker exec -it <container_id> bash
  2. 安装mysql-client(根据容器的基础镜像选择命令,比如Debian/Ubuntu用apt update && apt install mysql-client)
  3. 执行连接命令:mysql -h 127.0.0.1 -u unity -p unity_data,输入密码后看能不能成功登录。
    • 如果命令行能登录,那问题肯定出在Unity的Mono环境或MySQL驱动上,回到步骤1或3解决;
    • 如果命令行也登不上,那就是MySQL的用户权限或网络配置问题,重点排查步骤2。

先从步骤1开始测试吧,这个是最快定位问题的方法,毕竟SSL证书问题在容器化的Mono应用里太常见了😂

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 03:09:49