8.2.19. Настройка SSL для MySQL

При установке и удалении сертификата выполняется перезапуск инстанса.

Шифрование TLS/SSL используется для защиты передаваемых данных между клиентом и сервером. С помощью данной инструкции можно настроить шифрование с использованием собственного SSL-сертификата с проверкой на соответствие адреса хоста.

  1. Сгенерируйте файлы сертификата и ключа (в команде вместо example.mysql.network в двух строках используйте адрес хоста вашего инстанса):
    openssl req -x509 -newkey rsa:2048 \
      -sha256 -days 365 \
      -nodes \
      -keyout server-key.pem \
      -out server-cert.pem \
      -subj "/CN=example.mysql.network" \
      -addext "subjectAltName=DNS:example.mysql.network" \
      -addext "keyUsage=digitalSignature,keyEncipherment" \
      -addext "extendedKeyUsage=serverAuth"
  2. Установите сертификат в разделе «MySQL» на вкладке «Настройки → SSL» (поле с паролем приватного ключа оставьте пустым, если не указывали его при генерации сертификата и ключа):
  3. Проверьте адрес хоста в установленном сертификате (в команде используйте ваши данные для подключения: example.mysql.network — хост, 12345 — порт):
    openssl s_client -connect example.mysql.network:12345 -starttls mysql -showcerts </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -ext subjectAltName

    Без установленного сертификата вывод выглядит так:

    subject=CN = MySQL_Server_8.0.36-28_Auto_Generated_Server_Certificate
    issuer=CN = MySQL_Server_8.0.36-28_Auto_Generated_CA_Certificate
    No extensions in certificate

    После установки сертификата в выводе будет адрес хоста вашего инстанса:

    subject=CN = example.mysql.network
    issuer=CN = example.mysql.network
    X509v3 Subject Alternative Name:
        DNS:example.mysql.network
  4. Подключитесь к инстансу с использованием сертификата и убедитесь, что соединение зашифровано (в команде используйте ваши данные для подключения: example.mysql.network — хост, 12345 — порт, user — пользователь):
    mysql -h example.mysql.network -P 12345 -u user -p \
      --ssl-mode=VERIFY_IDENTITY \
      --ssl-ca=server-cert.pem \
      -e "SHOW STATUS LIKE 'Ssl_cipher'; SHOW STATUS LIKE 'Ssl_version';"

    Если всё настроено верно, подключение проходит успешно и вывод выглядит так:

    +---------------+------------------------+
    | Variable_name | Value                  |
    +---------------+------------------------+
    | Ssl_cipher    | TLS_AES_256_GCM_SHA384 |
    +---------------+------------------------+
    +---------------+---------+
    | Variable_name | Value   |
    +---------------+---------+
    | Ssl_version   | TLSv1.3 |
    +---------------+---------+

При подключении к инстансу через MySQL-клиент выбирайте режим VERIFY_IDENTITY и в качестве сертификата CA используйте сертификат сервера. Сертификат и ключ клиента не указывайте.

Содержание