C#调用MySqlConnector执行conn.Open()出现SSL连接错误及解决方法
C# MySqlConnector 连接MySQL出现SSL连接错误解决记录
问题描述
过去3天一直在排查C#中MySQL连接器的相关问题:按照MySqlConnector官方教程配置连接,尝试打开数据库连接写入数据,但执行到MySqlConnection.Open()方法时,代码会抛出SSL连接错误。先后尝试使用域名echstreme.de和对应的IP地址建立连接,二者均返回类似报错。
问题复现代码
public async void SQLInsert() { string connStr = "Server=echstreme.de;User=c1Look;Database=c1Look;Port=3306;Password=redacted;"; MySqlConnection conn = new MySqlConnection(connStr); try { await SendEmbedMessage("MySQL", "Attempting to connect to database"); conn.Open(); await SendEmbedMessage("MySQL", "Connection to Database Successful"); MySqlCommand cmd = new MySqlCommand(sqlQuery, conn); cmd.ExecuteNonQuery(); conn.Close(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
完整报错信息
MySql.Data.MySqlClient.MySqlException (0x80004005): SSL Connection error. ---> System.AggregateException: One or more errors occurred. (The handshake failed due to an unexpected packet format.) ---> System.IO.IOException: The handshake failed due to an unexpected packet format. at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslStream.PartialFrameCallback(AsyncProtocolRequest asyncRequest) --- End of stack trace from previous location where exception was thrown --- at System.Net.Security.SslStream.ThrowIfExceptional() at System.Net.Security.SslStream.InternalEndProcessAuthentication(LazyAsyncResult lazyResult) at System.Net.Security.SslStream.EndProcessAuthentication(IAsyncResult result) at System.Net.Security.SslStream.EndAuthenticateAsClient(IAsyncResult asyncResult) at System.Net.Security.SslStream.<>c.<AuthenticateAsClientAsync>b__64_2(IAsyncResult iar) at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization) --- End of inner exception stack trace --- at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) at MySql.Data.Common.Ssl.StartSSL(Stream& baseStream, Encoding encoding, String connectionString) at MySql.Data.Common.Ssl.StartSSL(Stream& baseStream, Encoding encoding, String connectionString) at MySql.Data.MySqlClient.NativeDriver.Open() at MySql.Data.MySqlClient.Driver.Open() at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings) at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection() at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection() at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver() at MySql.Data.MySqlClient.MySqlPool.GetConnection() at MySql.Data.MySqlClient.MySqlConnection.Open() at Bot.Admins.AdminCommands.SQLInsert() in C:\Users\Owner\source\repos\Bot\Bot\Admins\AdminCommands.cs:line 71
修复方案
修改数据库连接字符串,添加SSL Mode =None配置即可,修改后完整连接字符串如下:"Server=echstreme.de;Port=3306;Database=c1Look;Uid=c1Look;Pwd=;SSL Mode =None"
出现该问题的原因是MySQL连接器默认会尝试使用SSL和服务端建立连接,若目标数据库服务端未开启SSL支持,就会出现握手失败的SSL连接错误,显式关闭SSL连接模式即可正常建立连接。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

