MySQL Клиент и сервер не могут взаимодействовать, потому что у них нет общего алгоритма.

Я запускаю следующий код на сервере AWS, пытаясь подключиться к сервису mysql, предоставляемому AWS:

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 в строку подключения


person Rafael    schedule 16.11.2016    source источник
comment
TLS 1.2 был добавлен в 4.5.2. 4.5.1 больше не поддерживается. Мы уже находимся в .NET 4.6.2. Обновите свой проект до поддерживаемой версии   -  person Panagiotis Kanavos    schedule 16.11.2016
comment
какая у вас операционная система? Это помощь? serverfault.com/questions/751410/   -  person Muhammad Muazzam    schedule 26.11.2016
comment
Центр обработки данных Windows Server 2008 R2   -  person Rafael    schedule 02.12.2016


Ответы (3)


Я думаю, что шифрование, используемое клиентом и сервером, может отличаться. Проверьте шифрование, используемое mysql по умолчанию на aws, и попробуйте использовать то же самое в своем программном обеспечении. Тогда посмотрим, прав ли я ...

person Adiuvo    schedule 16.11.2016
comment
Как я могу это узнать? - person Rafael; 16.11.2016
comment
Я уже ответил на это как комментарий. Выполните обновление до поддерживаемой версии .NET (.NET 4.5.2+). TLS 1.2 был добавлен в 4.5.2. Поддержка 4.5.1 закончилась почти год назад - person Panagiotis Kanavos; 16.11.2016

.NET 4.5.1 больше не поддерживается. Окончание поддержки было 12 января 2016 г.. Об этом было объявлено два года назад. TLS 1.2 был добавлен в .NET 4.5.2, а это означает, что вы не можете ожидать добавления поддержки в неподдерживаемые версии.

Чтобы использовать TLS 1.2, вам необходимо обновить свои проекты до минимально поддерживаемой версии .NET, хотя было бы лучше выбрать последнюю версию (4.6.2), чтобы избежать запуска в других подобных ситуациях.

Многие провайдеры отказались от поддержки чего-либо меньшего, чем TLS 1.2, в прошлом году, не только Amazon. В этот раз в прошлом году произошла серьезная борьба, поскольку компании, которые откладывали обновления из-за опасений несовместимости, были вынуждены обновляться в паническом режиме.

person Panagiotis Kanavos    schedule 16.11.2016
comment
Я обновил свои проекты до 4.6.2, но проблема все еще остается - person Rafael; 22.11.2016

Из документации AWS:

Две распространенные причины сбоев подключения к новому экземпляру БД:

  1. Экземпляр БД был создан с использованием группы безопасности, которая не авторизует подключения с устройства или экземпляра Amazon EC2, на котором запущено приложение или служебная программа MySQL. Если экземпляр БД был создан в VPC, он должен иметь группу безопасности VPC, которая авторизует соединения. Если экземпляр БД был создан вне VPC, он должен иметь группу безопасности БД, которая авторизует соединения.

  2. Экземпляр БД был создан с использованием порта по умолчанию 3306, и в вашей компании есть правила брандмауэра, блокирующие подключения к этому порту с устройств в сети вашей компании. Чтобы исправить эту ошибку, воссоздайте экземпляр с другим портом.

Вы можете использовать SSL-шифрование при подключении к инстансу БД Amazon RDS MySQL. Для получения информации см. Использование SSL с базой данных MySQL. Экземпляр.

Хотя я хотел бы подтвердить, что варианты 1 и 2 не подходят, прежде чем продолжить, после того, как вы обесценили очевидное, проверьте свои разрешения, напрямую подключившись к серверу MySQL и набрав:

SHOW GRANTS FOR 'myuser'@'localhost'

Если обнаруживается что-то, относящееся к SSL, то происходит одно из двух:

  1. Вы неправильно включаете сертификат SSL в свой код

  2. Вы не включаете в свой код правильную часть сертификата SSL.

Следуйте этому руководству и убедитесь, что используете правильный 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:

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;
person smcjones    schedule 29.11.2016
comment
Эта команда выдает это сообщение об ошибке Error Code: 1141 There is no such grant defined for user 'userapp' on host 'testserver.rds.amazonaws.com' - person Rafael; 30.11.2016
comment
Я могу подключиться к базе данных с помощью SQLyog с этим пользователем, это только в .Net, где я получаю сообщение об ошибке `` общий алгоритм '' - person Rafael; 01.12.2016
comment
Я снова отредактировал. Проблема, скорее всего, в том, что у вас нет действующего сертификата SSL. Чтобы убедиться, что вы должны видеть то, что говорит SHOW GRANTS, это важный шаг в диагностике проблемы. - person smcjones; 01.12.2016
comment
Мы используем TLS 1.2, а не SSL - person Rafael; 02.12.2016
comment
Обратите внимание, что TLS и SSL часто используются как взаимозаменяемые. TLS является преемником SSL. MySQL не использует SSL-соединения. См .: dev.mysql.com/doc/refman/5.7/ ru / secure-connections.html - person smcjones; 02.12.2016