Рейтинг:2

Mysql 8.0 с Letsencrypt SSL в Ubuntu 20.4

флаг ht

Я установил SSL-сертификат Letsencrypt на свой VPN-сервер Ubuntu 20.4, и он работает. Теперь я пытаюсь настроить mysql на этом сервере для SSL. Я прочитал много связанных сообщений, посвященных одной и той же проблеме, и я потратил много часов, чтобы исправить это, но безуспешно.

Вот шаги, которые я сделал:

  • Я скопировал файлы cert.pem, chain.pem, fullchain.pem и privkey.pem в /var/lib/mysql. Это те же самые файлы, которые я использовал для настройки SSL моего домен.

  • Конфигурация в mysql была непонятна. Я пробовал разные комбинации в [mysql] и [mysqld]. Тот, который я ожидал быть правильным, не работал: ssl_ca=/var/lib/mysql/cert.pem,ssl_cert=/var/lib/mysql/chain.pem,ssl_key=/var/lib/mysql/privkey.pem

    Только эта конфигурация работает без выдачи ошибки. Примечание: fullchain.pem содержит сертификаты из cert.pem и chain.pem. В /etc/mysql/mysql.conf.d:

    [mysqld]
    
    ssl_cert=/var/lib/mysql/fullchain.pem
    
    ssl_key=/var/lib/mysql/privkey.pem
    

Я могу подключиться к mysql локально со своего сервера, и при проверке атрибутов ssl я получаю:

(я перечисляю только переменные со значениями)

| Имя_переменной | Значение |
+---------------------------------------------+----------- -----+
| have_openssl | ДА |                       
| have_ssl | ДА |
| performance_schema_show_processlist | ВЫКЛ |
| ssl_cert | /var/lib/mysql/fullchain.pem | |
| ssl_fips_mode | ВЫКЛ |
| SSL_ключ | /var/lib/mysql/privkey.pem 

Когда я бегу MySQL > \s, Я получил:

mysql версии 8.0.21 для Win64 на x86_64 (сервер сообщества MySQL — GPL)

Идентификатор соединения: 66
Текущая база данных:
Текущий пользователь: someUser@someIP
SSL: используется шифр TLS_AES_256_GCM_SHA384.
Использование разделителя: ;
Версия сервера: 8.0.26-0ubuntu0.20.04.3 (Ubuntu)
Версия протокола: 10
Соединение: maraxai.de ​​через TCP/IP
Набор символов сервера: utf8mb4
Набор символов БД: utf8mb4
Набор символов клиента: cp850
Набор символов соединения: cp850
TCP-порт: 3306
Двоичные данные как: Шестнадцатеричный

Когда я бегу $ openssl s_client -connect maraxai.de:3306 -имя_сервера maraxai.de, я ожидаю получить тот же результат, что и с $ openssl s_client -connect maraxai.de:443 -имя_сервера maraxai.de, то есть полная цепочка сертификатов с успешным рукопожатием, но вместо этого я получаю:

139990121219392: ошибка: 1408F10B: процедуры SSL: ssl3_get_record: неверный номер версии:../ssl/record/ssl3_record.c:331:
---
нет доступного однорангового сертификата
---
Имена ЦС сертификата клиента не отправлены
---
Рукопожатие SSL прочитало 5 байт и записало 302 байта
Проверка: ОК
---
Новый, (НЕТ), Шифр ​​(НЕТ)
Безопасное повторное согласование НЕ поддерживается
Сжатие: НЕТ
Расширение: НЕТ
ALPN не согласован
Предварительные данные не были отправлены
Подтвердите код возврата: 0 (хорошо)

В некоторых сообщениях предполагалось, что строка Рукопожатие SSL прочитало 5 байт и записало 302 байта предполагает, что рукопожатие SSL было начато, но прервано, так как сервер возвращает что-то неожиданное.

Для дальнейшей проверки я использую openssl s_client -connect maraxai.de:3306 -имя_сервера maraxai.de ​​-starttls mysql. Первый раздел рассказывает мне о ошибка: число = 20: невозможно получить сертификат локального эмитента и error:num=21:сертификат сервера не проверен для сертификата сервера (глубина: 0). Далее я вижу только один сертификат (cert.pem). Промежуточные сертификаты chain.pem не указаны. Это странно, поскольку я использую fullchain.pem, который представляет собой конкатенацию сертификатов в chain.pem и cert.pem.

ПОДКЛЮЧЕН(00000003)
глубина=0 CN = maraxai.de
ошибка подтверждения: число = 20: невозможно получить сертификат локального эмитента
проверить возврат: 1
глубина=0 CN = maraxai.de
ошибка проверки: число = 21: невозможно проверить первый сертификат
проверить возврат: 1
---
Цепочка сертификатов
 0 s:CN = maraxai.de
   i:C = US, O = Let’s Encrypt, CN = R3
---
Сертификат сервера
-----НАЧАТЬ СЕРТИФИКАТ-----
//МИФ...
-----КОНЕЦ СЕРТИФИКАТА-----
тема = CN = maraxai.de

эмитент = C = США, O = Let's Encrypt, CN = R3

---
Имена ЦС сертификата клиента не отправлены
Запрошенные алгоритмы подписи: ECDSA+SHA256:ECDSA+SHA384:ECDSA+SHA512:Ed25519:Ed448:RSA-PSS+SHA256:RSA-PSS+SHA384:RSA-PSS+SHA512:RSA-PSS+SHA256:RSA-PSS+SHA384: RSA-PSS+SHA512:RSA+SHA256:RSA+SHA384:RSA+SHA512:ECDSA+SHA224:RSA+SHA224
Алгоритмы общей запрашиваемой подписи: ECDSA+SHA256:ECDSA+SHA384:ECDSA+SHA512:Ed25519:Ed448:RSA-PSS+SHA256:RSA-PSS+SHA384:RSA-PSS+SHA512:RSA-PSS+SHA256:RSA-PSS+SHA384 :RSA-PSS+SHA512:RSA+SHA256:RSA+SHA384:RSA+SHA512
Дайджест одноранговой подписи: SHA256
Тип одноранговой подписи: RSA-PSS
Временный ключ сервера: X25519, 253 бита
---
SSL-рукопожатие прочитало 2027 байт и записало 448 байт.
Ошибка проверки: не удалось проверить первый сертификат
---
Новый, TLSv1.3, шифр TLS_AES_256_GCM_SHA384.
Открытый ключ сервера 2048 бит.
Безопасное повторное согласование НЕ поддерживается
Сжатие: НЕТ
Расширение: НЕТ
ALPN не согласован
Предварительные данные не были отправлены
Код возврата проверки: 21 (невозможно проверить первый сертификат)
---
---
Билет на новую сессию после рукопожатия прибыл:
SSL-сессия:
    Протокол: TLSv1.3
    Шифр: TLS_AES_256_GCM_SHA384.
    Идентификатор сеанса: B157BD91FF0A458D6A546C26CB5665C95CD88B99CE6C66A5D98783642C39EFA4.
    Идентификатор сеанса-ctx:
    Возобновление PSK: CB807FC16CE11EB47FE7BDDD99C71A5AAF1AE5CDC600A127230E914AFC4AE1018A34F72F44741D2440EB4917D5DDD0D7
    Идентификация PSK: нет
    Подсказка идентификации PSK: нет
    Имя пользователя SRP: нет
    Подсказка о сроке действия билета сеанса TLS: 7200 (секунд)
    Билет сеанса TLS:
    // ...0000 - 00e0


    Время начала: 1645286635
    Время ожидания: 7200 (сек)
    Код возврата проверки: 21 (невозможно проверить первый сертификат)
    Расширенный главный секрет: нет
    Макс. ранние данные: 0
---
читать Р БЛОК
2ââ#08S01Получено тайм-аут чтения коммуникационных пакетовread:errno=0

Чтобы проверить, правильно ли установлены эмитенты и субъекты сертификатов, я запускаю:

openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout

Здесь все выглядит нормально:

тема = CN = maraxai.de
эмитент = C = США, O = Let's Encrypt, CN = R3

subject=C = US, O = Let’s Encrypt, CN = R3
эмитент = C = США, O = Исследовательская группа по безопасности в Интернете, CN = ISRG Root X1

subject=C = США, O = Исследовательская группа по безопасности в Интернете, CN = ISRG Root X1
эмитент=O = Digital Signature Trust Co., CN = DST Root CA X3

Кроме того, для privkey.pem я изменил формат ключа на PKCS#1, чтобы получить правильный заголовок. -----НАЧАТЬ ЗАКРЫТЫЙ КЛЮЧ RSA----- с командой $ openssl rsa -in privkey.pem -out privkey.pem.

Я понятия не имею, как дальше исследовать этот вопрос. Любая помощь будет принята с благодарностью.

флаг in
Сертификаты SSL и порт 443 обычно применяются к Apache, а не к MySQL. Вы настроили MySQL для прослушивания как 3306, так и 443? Цель состоит в том, чтобы внешние машины подключались к этой базе данных через SSL, а не через более распространенный безопасный метод, такой как туннель SSH?
флаг ht
Да, мне нужно внешнее соединение. Я хочу запустить приложение Nodejs на своем домене, анкету. Вопросы хранятся в MySQL, как и ответы. По завершении будет создан PDF-файл, который будет отправлен пользователю по электронной почте. Сервер прослушивает порт 443 для Apache и порт 3306 для MySQL.
флаг ht
Я должен исправить себя: внешнее соединение mysql работает. Я получил: SSL: используется шифр TLS_AES_256_GCM_SHA384. Соединение: maraxai.de ​​через TCP/IP TCP-порт: 3306

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.