Шифрование в mysql

Использую mariadb на FreeBSD. В связи с POODLE было принято решение отказаться от использования SSL и перейти на TLS. Для установки tls в mysql или в mariadb необходимо установить openssl из портов с отключеным SSL. Осложнения возникли при попытке пересобрать mariadb, потому что mariadb собраная ранее с идущим в поставке yassl наотрез отказывалась пересобираться ругаясь на наличие портового openssl

** Port marked as IGNORE: databases/mariadb55-client:
security/openssl package is installed. To build this either select the OPENSSL and PORTSSL options or deinstall openssl
** Listing the failed packages (-:ignored / *:skipped / !:failed)
— databases/mariadb55-client (marked as IGNORE)

Вариант “или я или она” меня не устраивал. Поэтому всё равно собираем mariadb  с портовым openssl выставив нужные флаги

[X] SSL SSL protocol support
[X] OPENSSL Use OpenSSL instead of bundled yassl
[X] PORTSSL Use OpenSSL from port (requires OPENSSL to be set)

Теперь нужно разобраться с сертификатами. Важно чтобы Common Name сертификатов/ключей сервера и клиента отличалить от Common Name CA сертификата. В yassl общий Common Name не является помехой в установлении соединения. С openssl такое не проходит. Поэтому сертификаты лучше перегенирировать

Создание сертификата CA

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca-cert.pem

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

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

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

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

Проверка сертификатов

openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem

server-cert.pem: OK
client-cert.pem: OK

ca-cert.pem server-cert.pem, server-key.pem — оставляем на сервере и в my.cnf прописываем пути

[mysqld]
...
ssl-ca=/etc/ssl/certs/mysql/ca-cert.pem
ssl-cert=/etc/ssl/certs/mysql/server-cert.pem
ssl-key=/etc/ssl/certs/mysql/server-key.pem

ca-cert.pem client-cert.pem, client-key.pem  — отдаём клиенту

Проверка

В настройках соединения на клиенте указываем путь к ключам. Соединяемся, выполняем команды

SHOW STATUS LIKE 'Ssl_version';
Ssl_version TLSv1
SHOW STATUS LIKE 'Ssl_cipher';
Ssl_cipher DHE-RSA-AES256-SHA

Соединине состоялось по TLSv1 с использованием шифра DHE-RSA-AES256-SHA. Поздравляю!

P.S.

Клиенты поддерживающие шифрованые соединения

HeidiSQL (win32/64, linux под wine)
MySQL Workbench (win32/64, linux)

Александр Черных
системный администратор

Статьи по теме

0