Чи можна OpenSSL використовувати для налагодження з'єднання SSL з сервером MySQL?


21

Я хочу, щоб мій веб-сервер розмовляв із сервером баз даних MySQL через з'єднання SSL. Веб-сервер запускає CentOS5, сервер бази даних працює на FreeBSD. Сертифікати надає проміжний CA 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

Зверніть увагу, що Wireshark також можна використовувати для перевірки трафіку SSL на сервері MySQL, див. I.imgur.com/5uTkLqU.png .
Хайме Хаблуцель

Відповіді:


11

OpenSSL версії 1.1.1 (випущена 11 вересня 2018 р.) Додала підтримку -starttls mysqlв команді commit 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 .


12

Відповідаючи на власне запитання. Якщо у вас є краща відповідь з добрими, авторитетними джерелами, будь ласка, опублікуйте відповідь.

Коротка відповідь; Ні, OpenSSL не можна використовувати для налагодження з'єднань MySQL SSL. Це тому, що 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 встановлюється до того, як клієнт надсилає відповідь на аутентифікацію


1
Це те саме, що працює SMTP, коли ви використовуєте STARTTLS, і він також дозволяє вам використовувати зашифровані та незашифровані connectiosn на одному порту.
Синхро

Гм, я вважаю, поведінка, про яку я говорю, - це те, як працює STARTTLS, згідно з en.wikipedia.org/wiki/STARTTLS .
Стефан Ласевський

2
Хоча MySQL працює « як STARTTLS», він фактично не реалізує STARTTLS, принаймні, ні в якому разі, з якого я виявив, що OpenSSL може успішно взаємодіяти.
Крістофер Шульц

1

Поширеною причиною цієї проблеми є те, що загальна назва (CN) сертифіката CA є такою ж, як і сервер та / або сертифікат клієнта.

Дивіться тут: https://dev.mysql.com/doc/refman/5.6/uk/creating-ssl-certs.html

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


0

У мене виникають подібні проблеми з клієнтом MacOS X, який спілкується з сервером Ubuntu.

Чи можете ви перевірити, чи буде з'єднання спрацьованим, якщо ви не вистачите сертифікат на стороні клієнта та клієнтський ключ, просто маючи сертифікат сервера для сертифікату? Чи можете ви встановити зашифроване з'єднання? Для цього зазвичай потрібні БУДЬ-які налаштування для стовпця ssl_type асоційованого користувача.


0

Просто хотілося відзначити для нащадків, що якщо ви хочете використовувати балансир навантаження (наприклад, F5 або HAProxy) між MySQL та клієнтом, вам потрібно буде імпортувати ваш SSL сертифікат з балансира навантаження на сервер MySQL. Це пов’язано із запуском з'єднання, подібним до STARTTLS.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.