У меня проблемы с MySQL и OpenSSL. Я использую MySQL 5.7 и OpenSSL 1.1.0g на Ubuntu 16.04
. Независимо от того, какие сертификаты я загружаю, MySQL запускается, но не устанавливает соединение через SSL, если сертификаты проверены. Например, если я разрешаю ему создавать собственные сертификаты, это находится в /var/log/mysql/error.log:
2019-02-17T09:42:25.666293Z 0 [Примечание ] В каталоге данных найдены файлы ca.pem, server-cert.pem и server-key.pem. Попытка включить поддержку SSL с их помощью.
2019-02-17T09:42:25.666543Z 0 [Предупреждение] Сертификат CA ca.pem является самозаверяющим.
Вполне нормально. Но:
/usr/bin/openssl s_client -connect localhost:3306
дает мне это:
CONNECTED(00000003)
140234876264896:ошибка:1408F10B:процедуры SSL:ssl3_get_record:неправильный номер версии :../ssl/record/ssl3_record.c:252:
Если я создам отдельный CA и само-подписанные сертификаты с помощью openssl, это не будет иметь никакого значения -такая же ошибка. В крайнем случае я попытался использовать сертификат LetsEncrypt моего веб-сервера с сертификатом LE CA, чтобы избежать использования само-подписанного сертификата, с точно таким же результатом.
Оказывается, любое приложение, пытающееся подключиться, например phpMyAdmin, также завершается ошибкой OpenSSL, если только ему не разрешено небезопасное подключение.
Если я установил $cfg['Servers'][$i]['ssl_verify'] = false;
в phpMyAdmin/admin/config.inc.php
, он подключается через SSL, но с предупреждением «не проверено».
Исходя из этого, я думаю, что это похоже на ошибку ЦС, а не на ошибку сертификата, но, поскольку я получаю один и тот же результат независимо от того, какой сертификат ЦС настроен, я в растерянности. Какие-либо предложения?
Соединение MySQL SSL — это не просто стандартное соединение SSL с соединением MySQL внутри.
При установлении такого соединения клиент MySQL сначала устанавливает связь с сервером, используя открытый текстовый протокол MySQL, (если обе стороны согласны с использованием SSL), затем запускает SSL-соединение на том же TCP-соединении.
OpenSSL или другой SSL-клиент общего назначения не может понять незашифрованный текстовый протокол MySQL, они напрямую установят SSL-соединение без этого специфичного для MySQL рукопожатия, а затем сообщат об ошибке версии, поскольку это вообще не стандартный SSL-сервер.
Документ о том, как MySQL устанавливает SSL-соединение:https://dev.mysql.com/doc/internals/en/ssl.html