【问题标题】:MySQL The client and server cannot communicate, because they do not possess a common algorithmMySQL 客户端和服务器无法通信,因为它们没有共同的算法
【发布时间】:2016-11-16 12:19:19
【问题描述】:

我在 AWS 服务器上运行以下代码,尝试连接到 AWS 提供的 mysql 服务:

String conn = buildConnString(dc);
MySqlConnection connection = new MySqlConnection(conn);
connection.Open();

我收到以下异常消息和堆栈跟踪:

Exception: The client and server cannot communicate, because they do not possess a common algorithm 
StackTrace: at System.Net.SSPIWrapper.AcquireCredentialsHandle(SSPIInterface SecModule, String package, CredentialUse intent, SecureCredential scc)
   at System.Net.Security.SecureChannel.AcquireCredentialsHandle(CredentialUse credUsage, SecureCredential& secureCredential)
   at System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint)
   at System.Net.Security.SecureChannel.GenerateToken(Byte[] input, Int32 offset, Int32 count, Byte[]& output)
   at System.Net.Security.SecureChannel.NextMessage(Byte[] incoming, Int32 offset, Int32 count)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Net.Security.SslStream.AuthenticateAsClient(String targetHost, X509CertificateCollection clientCertificates, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation)
   at MySql.Data.MySqlClient.NativeDriver.StartSSL()
   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..ctor(MySqlConnectionStringBuilder settings)
   at MySql.Data.MySqlClient.MySqlPoolManager.GetPool(MySqlConnectionStringBuilder settings)
   at MySql.Data.MySqlClient.MySqlConnection.Open()

我正在运行 .Net 4.6.2 并且在服务器上启用了 TLS 1.2:OS Windows Server 2008 R2 Datacenter,我可以尝试解决这个问题吗?

编辑:

我终于通过在连接字符串中添加SslMode=None解决了这个问题

【问题讨论】:

  • TLS 1.2 在 4.5.2 中添加。 4.5.1 不再受支持。我们已经在 .NET 4.6.2 中了。将您的项目升级到受支持的版本
  • 你的操作系统是什么?这是帮助吗? serverfault.com/questions/751410/…
  • Windows Server 2008 R2 数据中心

标签: mysql amazon-web-services windows-server-2008-r2 tls1.2 .net-4.6


【解决方案1】:

我认为客户端和服务器使用的加密可能不同。检查 mysql 在 aws 上默认使用的加密,并尝试在您的软件中使用相同的加密。那我们看看我说的对不对……

【讨论】:

  • 我怎样才能找到它?
  • 我已经在评论中回答了这个问题。升级到受支持的 .NET 版本 (.NET 4.5.2+)。 TLS 1.2 在 4.5.2 中添加。 4.5.1 支持已于一年前结束
【解决方案2】:

.NET 4.5.1 不再受支持。支持结束是January 12, 2016。这是two years ago宣布的。 TLS 1.2 是在 .NET 4.5.2 中添加的,这意味着您不能期望将支持添加到不受支持的版本中。

为了使用 TLS 1.2,您必须将您的项目升级到受支持的最低 .NET 版本,但最好以最新版本 (4.6.2) 为目标,以避免在其他类似情况下运行。

很多供应商去年放弃了对低于 TLS 1.2 的支持,不仅仅是亚马逊。去年这个时候发生了相当大的争夺,因为担心不兼容而推迟升级的公司不得不在恐慌模式下升级。

【讨论】:

  • 我已将我的项目升级到 4.6.2 但问题仍然存在
【解决方案3】:

来自AWS documentation

导致新数据库实例连接失败的两个常见原因是:

  1. 数据库实例是使用不支持的安全组创建的 授权来自设备或 Amazon EC2 实例的连接,其中 MySQL 应用程序或实用程序正在运行。如果数据库实例是 在 VPC 中创建,它必须具有授权的 VPC 安全组 连接。如果数据库实例是在 VPC 之外创建的,则它 必须有一个授权连接的数据库安全组。

  2. 数据库 实例是使用默认端口 3306 创建的,而您的公司 有防火墙规则阻止从设备到该端口的连接 您的公司网络。要修复此故障,请使用以下命令重新创建实例 不同的端口。

您可以在连接到 Amazon RDS MySQL 数据库实例。有关信息,请参阅Using SSL with a MySQL DB Instance

虽然我会在继续之前确认选项 1 和 2 不是这种情况,但一旦您忽略了显而易见的问题,请通过直接访问 MySQL 服务器并输入以下内容来检查您的权限:

SHOW GRANTS FOR 'myuser'@'localhost'

如果出现与 SSL 相关的情况,则说明发生了以下两种情况之一:

  1. 您的代码中没有正确包含 SSL 证书

  2. 您的代码中没有包含正确的 SSL 证书部分。

关注this tutorial 并确保您运行的是正确的 SSL 证书。您应该能够重建您的证书并成功运行。

从上面的链接,如果你有 SSL 加密,你的最终代码应该是这样的:

using (MySqlConnection connection = new MySqlConnection(
  "database=test;user=sslclient;" +
  "CertificateFile=H:\\bzr\\mysql-trunk\\mysql-test\\std_data\\client.pfx" +
  "CertificatePassword=pass;" +
  "SSL Mode=Required "))
{
    connection.Open();
}

\path\to\client.pfx 是您的.pfx 文件的路径。

如果没有显示或您收到 cmets Error Code: 1141 There is no such grant defined for user '***' on host '***.***.***' 中解释的错误,您可以通过其他方式检查您的用户权限。

在 MySQL 外壳上:

select * from mysql.user where User='<myuser>';

如果您在主机中看到通配符,则表示用户可以从任何地方登录。虽然非常不安全,但这可能是您正在寻找的。然后,您可以返回并使用SHOW GRANTS 完全按照返回查询中显示的主机名镜像。

请注意,您可能会看到如下内容:

Host
-----
%.myhostname.tld

如果您的域是 subdomain.myhostname.tld,则此通配符匹配,您将使用:

SHOW GRANTS FOR 'myuser'@'%.myhostname.tld';

如果您没有具有任何匹配权限的用户

您将根本无法连接到您的 MySQL 实例。您需要创建一个与您的主机匹配的用户。

CREATE USER 'myuser'@'myhost' IDENTIFIED BY '<password>';

GRANT ALL ON <database>.* TO 'myuser'@'myhost';

如果你想要 SSL:

GRANT ALL ON <database>.* TO 'myuser'@'myhost' REQUIRE SSL;

【讨论】:

  • 该命令抛出此错误消息Error Code: 1141 There is no such grant defined for user 'userapp' on host 'testserver.rds.amazonaws.com'
  • 我可以使用 SQLyog 与该用户连接到数据库,它只是在 .Net 上,我收到“通用算法”错误消息
  • 我又编辑了。问题很可能是您没有有效的 SSL 证书。为了验证您是否应该看到 SHOW GRANTS 所说的内容 - 这是诊断问题的重要一步。
  • 我们使用的是 TLS 1.2,而不是 SSL
  • 请注意,TLS 和 SSL 通常可以互换使用。 TLS 是 SSL 的继承者。 MySQL 不使用 SSL 连接。见:dev.mysql.com/doc/refman/5.7/en/secure-connections.html
猜你喜欢
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 2016-11-09
  • 1970-01-01
相关资源
最近更新 更多