Я хочу, чтобы мой веб-сервер говорил с сервером базы данных MySQL через соединение SSL. На веб-сервере работает CentOS5, на сервере базы данных работает FreeBSD. Сертификаты предоставляются промежуточным центром сертификации DigiCert.
MySQL должен использовать ssl, в соответствии с my.cnf
:
# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
ssl
ssl-capath = /opt/mysql/pki/CA
ssl-cert = /opt/mysql/pki/server-cert.pem
ssl-key = /opt/mysql/pki/server-key.pem
Когда я запускаю MySQL, демон запускается без ошибок. Это говорит о том, что все файлы сертификатов доступны для чтения.
Но когда я пытаюсь подключиться с веб-сервера к серверу базы данных, я получаю сообщение об ошибке:
[root@webserver ~]# mysql -h mysql.example.org -u user -p
ERROR 2026 (HY000): SSL connection error
И если я попытаюсь отлаживать дальше с openssl:
[root@webserver ~]# openssl s_client -connect mysql.example.org:3306 0>/dev/null
CONNECTED(00000003)
15706:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:588:
Это правильный способ проверить SSL-соединение с сервером базы данных MySQL? Это SSL23_GET_SERVER_HELLO:unknown protocol
странное сообщение, так как это обычно происходит, если вы говорите по SSL на порте, предназначенном для трафика без SSL.
Эта же команда openssl, похоже, отлично работает с серверами LDAP и HTTP:
$ openssl s_client -connect ldap.example.org:636 0>/dev/null
CONNECTED(00000003)
depth=2 /C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
...
$ openssl s_client -connect www.example.org:443 0>/dev/null
CONNECTED(00000003)
depth=0 /DC=org/DC=example/OU=Services/CN=www.example.org
Ответы:
Версия 1.1.1 OpenSSL (выпущена 11 сентября 2018 г.) добавлена поддержка
-starttls mysql
в коммите a2d9cfbac5d87b03496d62079aef01c601193b58 . К сожалению, я не могу найти ссылку на эту новую функцию в журнале изменений OpenSSL.Если ваш дистрибутив еще не имеет этой версии, есть статически скомпилированный двоичный файл openssl по адресу https://testssl.sh/openssl-1.0.2k-dev-chacha.pm.ipv6.Linux+FreeBSD.tar.gz, который поддерживает
-starttls mysql
, Я нашел ссылку на него в http://www.danneman.org/presentations/Automating_TLS_Configuration_Verification.pdf .Для Windows двоичные файлы OpenSSL 1.1.1 можно найти по адресу https://wiki.openssl.org/index.php/Binaries
Я сгенерировал сертификаты SSL, как описано в https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html , попробовал, и это работает:
Также имеется
-starttls
поддержка postgres и ldap в OpenSSL 1.1.1. См. Https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_client.c#L815-L831 для получения полного списка.источник
Отвечая на мой собственный вопрос. Если у вас есть лучший ответ с хорошими, авторитетными источниками, пожалуйста, оставьте ответ.
Короткий ответ; Нет, OpenSSL нельзя использовать для отладки SSL-соединений MySQL. Это связано с тем, что MySQL начинает сеанс с использованием открытого текста и впоследствии переключается на SSL.
При чтении https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase.html MySQL запускается с незашифрованным соединением, а затем после этого инициируется фактический SSL. Это объясняет, как MySQL может прослушивать на одном порту (порт 3306) как открытый текст, так и зашифрованные соединения. Сравните это с сервером HTTP или LDAP, где один порт используется для незашифрованных соединений, а второй - для зашифрованных соединений.
источник
Распространенной причиной этой проблемы является то, что общее имя (CN) сертификата CA совпадает с сертификатом сервера и / или клиента.
Смотрите здесь: https://dev.mysql.com/doc/refman/5.6/en/creating-ssl-certs.html
Попробуйте заново создать свой CA и сертификат (ы) и убедиться, что во всех случаях используется уникальный CN.
источник
Я сталкиваюсь с подобной проблемой с клиентом MacOS X, связывающимся с сервером Ubuntu.
Можете ли вы проверить, будет ли работать соединение, если вы пропустите сертификат на стороне клиента и ключ клиента, просто имея CA для сертификата сервера? Вы можете установить зашифрованное соединение? Это обычно требует ЛЮБОЙ настройки для столбца ssl_type ассоциированного пользователя.
источник
Просто хочу отметить для потомков, что если вы хотите использовать балансировщик нагрузки (такой как F5 или HAProxy) между MySQL и клиентом, вы захотите импортировать свой SSL-сертификат из балансировщика нагрузки на сервер MySQL. Это связано с запуском STARTTLS-подобного соединения.
источник