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 |
    +---------------+---------+
Зміст