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

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

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

Для выполнения команд используйте консоль на вашем устройстве. В результате будут сформированы файлы сертификатов и ключей. Файлы серверного сертификата устанавливаются на хостинге, файлы клиентского сертификата используются при настройке клиента, сертификат CA используется для проверки подлинности серверного и клиентского сертификатов.

  1. Создайте сертификат CA (Certificate Authority), который будет использоваться для подписания и проверки серверного и клиентского сертификатов:
    openssl req -new -x509 -newkey rsa:4096 -nodes -sha256 -days 3650 \
      -keyout ca-key.pem \
      -out ca-cert.pem \
      -subj "/CN=MySQL_CA" \
      -addext "basicConstraints=critical,CA:true,pathlen:0" \
      -addext "keyUsage=critical,keyCertSign,cRLSign"
  2. Создайте серверный сертификат (в командах вместо example.mysql.network используйте адрес хоста вашего инстанса):
    1. Создайте ключ и CSR:
      openssl req -new -newkey rsa:2048 -nodes -sha256 \
        -keyout server-key.pem \
        -out server-req.pem \
        -subj "/CN=example.mysql.network"
    2. Подпишите сертификат:
      openssl x509 -req -sha256 -days 365 \
        -in server-req.pem \
        -CA ca-cert.pem \
        -CAkey ca-key.pem \
        -CAcreateserial \
        -out server-cert.pem \
        -extfile <(printf "basicConstraints=critical,CA:FALSE\nkeyUsage=critical,digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth\nsubjectAltName=DNS:example.mysql.network")
  3. Создайте клиентский сертификат:
    1. Создайте ключ и CSR:
      openssl req -new -newkey rsa:2048 -nodes -sha256 \
        -keyout client-key.pem \
        -out client-req.pem \
        -subj "/CN=mysql-client"
    2. Подпишите сертификат:
      openssl x509 -req -sha256 -days 365 \
        -in client-req.pem \
        -CA ca-cert.pem \
        -CAkey ca-key.pem \
        -CAserial ca-cert.srl \
        -out client-cert.pem \
        -extfile <(printf "basicConstraints=critical,CA:FALSE\nkeyUsage=critical,digitalSignature,keyEncipherment\nextendedKeyUsage=clientAuth")
  4. Установите серверный сертификат, его ключ и сертификат CA в разделе «MySQL» на вкладке «Настройки → SSL» (поле с паролем приватного ключа оставьте пустым, если не указывали его при создании сертификата):
  5. Проверьте адрес хоста в установленном сертификате (в команде используйте ваши данные для подключения: 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
  6. Подключитесь к инстансу с использованием клиентского сертификата и убедитесь, что соединение зашифровано (в команде используйте ваши данные для подключения: example.mysql.network — хост, 12345 — порт, user1 — пользователь):
    mysql -h example.mysql.network -P 12345 -u user1 -p --ssl-mode=VERIFY_IDENTITY --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.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 |
    +---------------+---------+
Содержание