Назад | Перейти на главную страницу

Можно ли использовать OpenSSL для отладки SSL-соединения с сервером MySQL?

Я хочу, чтобы мой веб-сервер разговаривал с сервером базы данных 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

OpenSSL версии 1.1.1 (выпущен 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, попробовал, и все работает:

$ echo | bin/openssl.Linux.x86_64.static s_client -starttls mysql -connect spx-bionic.censored.com:3306 -CAfile /tmp/ca.pem
CONNECTED(00000003)
depth=1 C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = mysql test CA
verify return:1
depth=0 C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = spx-bionic.censored.com
verify return:1
---
Certificate chain
 0 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=spx-bionic.censored.com
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
 1 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
---
Server certificate
-----BEGIN CERTIFICATE-----
CENSORED
-----END CERTIFICATE-----
subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=spx-bionic.censored.com
issuer=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
---
No client certificate CA names sent
Client Certificate Types: RSA sign, DSA sign, ECDSA sign
Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Shared Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Peer signing digest: SHA512
Server Temp Key: ECDH, P-521, 521 bits
---
SSL handshake has read 2599 bytes and written 632 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: AD25B7C3018E4715F262188D982AAE141A232712316E0A3292B0C14178E0F505
    Session-ID-ctx: 
    Master-Key: C121967E8FAEC4D0E0157419000660434D415251B0281CCBFC6D7A2AE8B0CC63AEFE22B332E91D31424C1BF03E5AF319
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 82 db 03 0f c0 ce f2 26-62 bd 1b 18 71 03 88 db   .......&b...q...
    0010 - a6 66 7c 71 94 0c d5 ec-96 30 46 53 4a e6 cd 76   .f|q.....0FSJ..v
    0020 - 66 b3 22 86 7d 9f 7e 2c-14 1d 66 f2 46 8f d2 d3   f.".}.~,..f.F...
    0030 - f7 0a 0b f5 9e 05 97 e1-2b b3 ba 79 78 16 b8 59   ........+..yx..Y
    0040 - dc c5 0d a8 de 0b 3a df-4b ec f9 73 3f 4c c3 f1   ......:.K..s?L..
    0050 - 86 b6 f7 aa a7 92 84 77-9f 09 b2 cc 5d dd 35 41   .......w....].5A
    0060 - 23 5d 77 74 e1 96 91 ac-28 81 aa 83 fe fc d2 3c   #]wt....(......<
    0070 - f9 23 09 6d 00 e0 da ef-48 69 92 48 54 61 69 e8   .#.m....Hi.HTai.
    0080 - 30 0e 1f 49 7d 08 63 9e-91 70 fc 00 9f cd fe 51   0..I}.c..p.....Q
    0090 - 66 33 61 24 42 8f c2 16-57 54 48 ec 6a 87 dc 50   f3a$B...WTH.j..P

    Start Time: 1537350458
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
DONE

А также есть -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, где один порт используется для соединений с открытым текстом, а второй порт используется для зашифрованных соединений.

Он начинается с того, что клиент подключается () к серверу, который может отправить пакет ERR и завершить рукопожатие или отправить начальный пакет подтверждения, на который клиент отвечает пакетом ответа на подтверждение. На этом этапе клиент может запросить SSL-соединение, и в этом случае канал связи SSL устанавливается до того, как клиент отправит свой ответ аутентификации.

Распространенной причиной этой проблемы является то, что общее имя (CN) сертификата CA совпадает с сертификатом сервера и / или клиента.

Посмотреть здесь: https://dev.mysql.com/doc/refman/5.6/en/creating-ssl-certs.html

Попробуйте воссоздать свой CA и сертификат (ы) и убедитесь, что во всех случаях используется уникальный CN.

Я столкнулся с похожей проблемой, когда клиент MacOS X обменивается данными с сервером Ubuntu.

Можете ли вы проверить, будет ли соединение работать, если вы не укажете сертификат на стороне клиента и ключ клиента, имея только ЦС для сертификата сервера? Вы можете установить зашифрованное соединение? Обычно для этого требуется параметр ANY для столбца ssl_type связанного пользователя.

Просто хотел отметить для потомков, что если вы хотите использовать балансировщик нагрузки (например, F5 или HAProxy) между MySQL и клиентом, вам нужно будет импортировать свой SSL-сертификат из балансировщика нагрузки на сервер MySQL. Это связано с запуском соединения типа STARTTLS.