使用 TLS 1.1 连接到 MySQL 数据库时升级到 .NET 6 后出现 SSL 身份验证错误

jan*_*nan 5 c# ssl tls1.1 asp.net-core-3.1 asp.net-core-6.0

我有一个版本为1.1MySQL的数据库。我使用以下代码片段在我的应用程序中建立连接:5.7.19TLS.NET Core 3.1

\n
string connStr = "server=Myserver;user id=myuser;password=my password;database=db;SslMode=Required;SslCa=D:\\\\server-ca.pem;SslCert=D:\\\\client-cert.pem;SslKey=D:\\\\client-key.pem;";\n\ntry\n{\n    using (MySqlConnection connection = new MySqlConnection(connStr))\n    {\n        connection.Open();\n        connection.Close();\n    }\n}\ncatch (Exception ex)\n{\n    // handle the exception\n}\n\n\n
Run Code Online (Sandbox Code Playgroud)\n

此代码在 中运行良好.NET Core 3.1,但升级到 后.NET 6,它会抛出以下异常:

\n
\n

MySqlConnector.MySqlException(0x80004005): SSL 身份验证错误\\ r\\ n-- - > System.Security.Authentication.AuthenticationException: 身份验证失败,请参阅内部异常。\\r\\ n-- - > System.ComponentModel.Win32Exception (0x8009030E):System.Net.Security.SslStreamPal.AcquireCredentialsHandle(CredentialUse credUsage, SCH_CREDENTIALS *) 的 System.Net.SSPIWrapper.AcquireCredentialsHandle(ISSPIInterface secModule, String package, CredentialUseintent, SCH_CREDENTIALS * scc) 的安全包中没有可用的凭据。 secureCredential)在System.Net.Security.SslStreamPal.AcquireCredentialsHandleSchCredentials(SslStreamCertificateContext证书Context,SslProtocols协议,EncryptionPolicy策略,Boolean isServer)在System.Net.Security.SslStreamPal.AcquireCredentialsHandle(SslStreamCertificateContext证书Context,SslProtocols协议,EncryptionPolicy策略,布尔值 isServer) -- - 内部异常堆栈跟踪结束-- - 在 System.Net.Security.SslStreamPal.AcquireCredentialsHandle(SslStreamCertificateContextcertificateContext、SslProtocols 协议、EncryptionPolicy 策略、Boolean isServer) 在 System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[] &thumbPrint)在 System.Net.Security.SecureChannel.GenerateToken(ReadOnlySpan1 inputBuffer, Byte[]& output) \xc2\xa0at System.Net.Security.SecureChannel.NextMessage(ReadOnlySpan\n1 incomingBuffer) 在 System.Net.Security.SslStream.ProcessBlob(Int32 frameSize) 在 System.Net.Security.SslStream.ReceiveBlobAsync[TIOAdapter](TIOAdapter 适配器) 在 System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](TIOAdapter)适配器,布尔receiveFirst,字节[] reAuthenticationData,布尔isApm)在System.Net.Security.SslStream.AuthenticateAsClient(SslClientAuthenticationOptions sslClientAuthenticationOptions)在MySqlConnector.Core.ServerSession.InitSslAsync(ProtocolCapativity serverCapativity,ConnectionSettings cs,MySqlConnection连接,SslProtocols sslProtocols,IOBehavior io行为/_/src/MySqlConnector/Core/ServerSession.cs 中的 CancellationToken CancellationToken): 第 1539 行位于 /_/_中的 MySqlConnector.Core.ServerSession.InitSslAsync(ProtocolCapabilities serverCapabilities, ConnectionSettings cs, MySqlConnection 连接, SslProtocols sslProtocols, IOBehavior ioBehavior, CancellationToken CancellationToken) /src/MySqlConnector/Core/ServerSession.cs:第 1569 行位于 /_/src/MySqlConnector 中的 MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs, MySqlConnection 连接, Int32 startTickCount, ILoadBalancer loadBalancer, Activity 活动, IOBehavior ioBehavior, CancellationToken CancellationToken) /Core/ServerSession.cs:/_/src/MySqlConnector/Core/ConnectionPool.cs中的MySqlConnector.Core.ConnectionPool.ConnectSessionAsync(MySqlConnection connection, String logMessage, Int32 startTickCount, Activity Activity, IOBehavior ioBehavior, CancellationToken CancellationToken)第539行: /_/src/MySqlConnector/Core/ConnectionPool.cs 中的 MySqlConnector.Core.ConnectionPool.ConnectSessionAsync(MySqlConnection connection, String logMessage, Int32 startTickCount, Activity Activity, IOBehavior ioBehavior, CancellationToken CancellationToken) 第 403 行:MySqlConnector.Core 中的第 408 行。 / _ / src / MySqlConnector / Core / ConnectionPool.cs中的ConnectionPool.GetSessionAsync(MySqlConnection连接,Int32 startTickCount,Activity活动,IOBehavior ioBehavior,CancellationTokencancellationToken):第98行位于MySqlConnector.Core.ConnectionPool.GetSessionAsync(MySqlConnection连接,Int32 startTickCount, /_/src/MySqlConnector/Core/ConnectionPool.cs中的Activity活动,IOBehavior ioBehavior,CancellationToken CancellationToken):第128行处MySqlConnector.MySqlConnection.CreateSessionAsync(ConnectionPool pool, Int32 startTickCount, Activity活动,Nullable\ 1 ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlConnection.cs:line 929 \xc2\xa0at MySqlConnector.MySqlConnection.OpenAsync(Nullablen1 ioBehavior,CancellationToken CancellationToken)中/ _ / src / MySqlConnector / MySqlConnection.cs:位于D中的WebApplication1.Program.Main(String [] args)中的MySqlConnector.MySqlConnection.Open()的第423行:第382行: \\WebApplication1\\WebApplication1\\Program.cs:第 24 行

\n
\n

有谁知道 .NET 6 中是否有任何重大更改可能导致此问题?如果没有,任何有关如何处理此错误的建议将不胜感激。

\n

编辑: \n这里提到的数据库版本正在由一位最终用户使用,并且他们不愿意升级。因此,我正在寻找具体文档以确认我的用户不正式支持此版本。

\n

先感谢您!

\n

Cha*_*ace 3

TLS v1.1 现在基本上已弃用并且不安全。您拥有的 MySQL 版本 (5.7) 仅在某些情况下支持 TLS v1.2。请参阅文档,但基本上您需要自己构建 MySQL,或使用 MySQL Commercial。您可能还需要一些其他配置选项

还有一些其他选项:

  • 升级到 MySQL v8+。我强烈建议您这样做,因为您正处于弃用 5.7 的边缘。
  • 在您的客户端计算机中允许 TLS 1.1。我强烈建议您要这样做,但如果您愿意,您可以使用免费的IIS Crypto 应用程序,它适用于任何版本的 Windows,包括客户端版本。对于 Linux,您需要更改该openssl.conf文件。
  • 禁用此 MySQL 连接的加密。通过使用Encrypt=False我强烈建议您不要通过公共互联网执行此操作。