使用SSL证书文件认证时C# .NET 7.0无法连接Azure MySQL数据库
解决MacOS下.NET 7连接Azure MySQL失败的问题
问题根源
- 过时的MySQL驱动包:你使用的
MySql.Data 6.8.3是基于.NET Framework开发的旧版本,对.NET 7(跨平台.NET)兼容性极差,这也是NU1701警告的直接原因。旧版本驱动不支持Azure MySQL要求的TLS 1.2+协议,进而引发bad protocol version认证错误。 - 冗余的SSL配置:Azure MySQL的根证书已被多数主流系统信任,手动指定本地证书反而可能在MacOS加密框架下触发兼容性问题。
解决方案步骤
1. 替换MySQL驱动包
移除过时的MySql.Data,改用MySqlConnector——这是针对.NET Core/.NET 5+优化的高性能跨平台驱动,兼容性更可靠:
- 卸载旧包:
dotnet remove package MySql.Data - 安装MySqlConnector:
dotnet add package MySqlConnector --version 2.2.5
2. 精简项目配置(.csproj)
删除无关依赖(如SqlServer EF包,你连接的是MySQL无需该组件),保留必要项:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net7.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <!-- 若需用EF Core操作MySQL,可添加MySql的EF包 --> <!-- <PackageReference Include="MySqlConnector.EntityFrameworkCore" Version="2.2.5" /> --> <PackageReference Include="MySqlConnector" Version="2.2.5" /> <PackageReference Include="System.Text.Encoding.CodePages" Version="7.0.0" /> </ItemGroup> </Project>
3. 修改连接代码
更新命名空间,调整连接字符串配置(移除本地证书指定,强制匹配Azure要求的TLS版本):
using MySqlConnector; using System.Text; internal class Program { private static void Main(string[] args) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder { Server = "AzureDatabaseName.mysql.database.azure.com", Port = 3306, Database = "DatabaseName", UserID = "AzureDBUsername", Password = "AzureDBPass", SslMode = MySqlSslMode.Required, TLSVersion = MySqlTlsVersion.Tls12 // 强制指定TLS 1.2,匹配Azure安全要求 }; // 使用using语句自动管理连接释放,无需手动Close using MySqlConnection conn = new MySqlConnection(builder.ConnectionString); try { Console.WriteLine("Connecting to MySQL..."); conn.Open(); Console.WriteLine("Connected!"); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } finally { Console.WriteLine("Connection closed."); } } }
4. 额外验证(若问题仍存在)
- 检查MacOS系统版本:确保系统已更新,支持TLS 1.2+协议
- 确认Azure MySQL服务器设置:在Azure门户中,将MySQL服务器的最低TLS版本配置为1.2
关键说明
- MySqlConnector是当前.NET生态中最可靠的MySQL跨平台驱动,Oracle官方的MySql.Data对.NET Core/.NET 5+的支持滞后且问题较多
- 强制指定
TLSVersion = MySqlTlsVersion.Tls12可避免驱动自动协商低版本协议的风险,完全适配Azure MySQL的安全规则
内容的提问来源于stack exchange,提问作者TiltControlledTyping
相关产品推荐
相关产品推荐

