MySQL客户端和服务器无法通信,因为它们没有通用的算法

时间:2016-11-16 12:19:20

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

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

employee

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

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

我正在运行.Net 4.6.2并且在服务器上启用了TLS 1.2:操作系统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() ,我可以尝试解决此问题吗?

修改

我终于通过在连接字符串

中添加Windows Server 2008 R2 Datacenter来解决了这个问题

3 个答案:

答案 0 :(得分:1)

我认为客户端和服务器使用的加密可能不同。检查aws上mysql默认使用的加密,并尝试在软件中使用相同的加密。然后我们会看看我是不是......

答案 1 :(得分:1)

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

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

很多很多的提供商去年放弃了对TLS 1.2以下的任何东西的支持,而不仅仅是亚马逊。由于担心不兼容而推迟升级的公司不得不在恐慌模式下升级,因此去年这个时候出现了相当大的争夺。

答案 2 :(得分:1)

来自AWS documentation

  

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

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

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

  4.         

    您可以在与。的连接上使用SSL加密   Amazon RDS MySQL数据库实例。有关信息,请参阅Using SSL with a MySQL DB Instance

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

SHOW GRANTS FOR 'myuser'@'localhost'

如果出现与SSL相关的内容,则会发生以下两种情况之一:

  1. 您未在代码中正确包含SSL证书

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

  3. 关注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文件的路径。

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

    在MySQL shell上:

    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;