我在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
来解决了这个问题
答案 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)
新数据库实例连接失败的两个常见原因是:
数据库实例是使用没有安全组的安全组创建的 授权来自设备或Amazon EC2实例的连接 MySQL应用程序或实用程序正在运行如果数据库实例是 在VPC中创建,它必须具有授权的VPC安全组 连接。如果数据库实例是在VPC之外创建的,那么 必须具有授权连接的数据库安全组。
- 醇>
数据库 实例是使用默认端口3306和您的公司创建的 防火墙规则阻止从该设备到该端口的连接 你的公司网络。要修复此故障,请使用重新创建实例 一个不同的港口。
您可以在与。的连接上使用SSL加密 Amazon RDS MySQL数据库实例。有关信息,请参阅Using SSL with a MySQL DB Instance。
虽然在继续操作之前我会确认选项1和2不是这种情况,但是一旦您对明显的选项打了折扣,请通过直接访问MySQL服务器并输入以下内容来检查您的权限:
SHOW GRANTS FOR 'myuser'@'localhost'
如果出现与SSL相关的内容,则会发生以下两种情况之一:
您未在代码中正确包含SSL证书
您未在代码中包含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
文件的路径。
如果没有显示任何内容或收到评论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;