8.2.19. Налаштування SSL для MySQL
Шифрування TLS/SSL використовується для захисту даних, що передаються між клієнтом і сервером. За допомогою цієї інструкції можна налаштувати шифрування з використанням власного SSL-сертифіката з перевіркою відповідності адреси хоста.
Для виконання команд використовуйте консоль на вашому пристрої. У результаті будуть сформовані файли сертифікатів і ключів. Файли серверного сертифіката встановлюються на хостингу, файли клієнтського сертифіката використовуються при налаштуванні клієнта, сертифікат CA використовується для перевірки автентичності серверного та клієнтського сертифікатів.
- Створіть сертифікат 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" - Створіть серверний сертифікат (у командах замість
example.mysql.networkвикористовуйте адресу хосту вашого інстансу):- Створіть ключ і CSR:
openssl req -new -newkey rsa:2048 -nodes -sha256 \ -keyout server-key.pem \ -out server-req.pem \ -subj "/CN=example.mysql.network" - Підпишіть сертифікат:
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")
- Створіть клієнтський сертифікат:
- Створіть ключ і CSR:
openssl req -new -newkey rsa:2048 -nodes -sha256 \ -keyout client-key.pem \ -out client-req.pem \ -subj "/CN=mysql-client" - Підпишіть сертифікат:
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")
- Встановіть серверний сертифікат, його ключ та сертифікат CA у розділі «MySQL» на вкладці «Налаштування → SSL» (поле з паролем приватного ключа залиште порожнім, якщо не вказували його при створенні сертифіката):

- Перевірте адресу хоста у встановленому сертифікаті (в команді використовуйте ваші дані для підключення:
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 - Підключіться до інстансу з використанням клієнтського сертифіката та переконайтеся, що з’єднання зашифровано (у команді використовуйте ваші дані для підключення:
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 | +---------------+---------+