Вопрос или проблема
У меня установлена MariaDB 10.11 на RedHat 8.10. Я активировал One-Way TLS на сервере для теста. Я использовал следующий учебник:
https://mariadb.com/kb/en/securing-connections-for-client-and-server/ :
- Установите путь к X509 сертификату сервера, установив системную переменную ssl_cert.
- Установите путь к закрытому ключу сервера, установив системную переменную ssl_key.
- Если вы не используете сертификат, который был подписан доверенным центром сертификации (CA), вам нужно установить путь к цепочке сертификатов центров сертификации, которая может проверить сертификат сервера, установив либо системную переменную ssl_ca, либо ssl_capath.
- Если вы хотите ограничить сервер определенными шифрами, то вам также нужно установить системную переменную ssl_cipher.
Сначала я создал ключ и сертификат:
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem
openssl req -newkey rsa:2048 -days 365000 -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 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pe
chown -Rv mysql:root /etc/my.cnf.d/tls/
Затем я добавил следующую конфигурацию SSL в файл server.cnf
и перезапустил службу MariaDB.
ssl-ca=/etc/my.cnf.d/tls/ca-cert.pem
ssl-cert=/etc/my.cnf.d/tls/server-cert.pem
ssl-key=/etc/my.cnf.d/tls/server-key.pem
require_secure_transport=ON
Затем я создал пользователя с опцией “required ssl”. Согласно учебнику, я добавил следующие строки в клиентский файл:
ssl_ca = /etc/my.cnf.d/certificates/ca.pem
ssl-verify-server-cert
Теперь подключение к базе данных с помощью:
mariadb -u test_user -p
Приводит к ошибке:
ERROR 2026 (HY000):
TLS/SSL error:
Validation of SSL server certificate failed
Ошибка в файле журнала:
[Warning] Aborted connection 55 to db: 'unconnected' user: 'unauthenticated' host: 'mon.example.com' (This connection closed normally without authentication)
Когда ssl-verify-server-cert
удалено из client.cnf
, пользователь может подключиться к базе данных. Но без этой опции пользователь не проверяет сертификат.
Неправильный путь к файлу CA?
Конфигурация сервера имеет /etc/my.cnf.d/tls/ca-cert.pem
для корневого сертификата, что соответствует тому, как вы создали файлы, но в конфигурации клиента имеется /etc/my.cnf.d/certificates/ca.pem
. Это может быть ошибкой в вопросе, но если нет, это объясняет, почему клиент MariaDB не смог прочитать файл. Попробуйте:
ssl_ca = /etc/my.cnf.d/tls/ca-cert.pem
ssl-verify-server-cert
Недостаточные разрешения на файлы?
Проверьте разрешения на файлы. Клиент должен иметь возможность прочитать сертификат ca-cert.pem
, но не должен иметь возможность прочитать секретный ключ ca-key.pem
. Под тем же пользователем, под которым вы запускаете mariadb
, вы можете просто попробовать прочитать файлы или перечислить разрешения с помощью ls
.
cat /etc/my.cnf.d/tls/ca-cert.pem
cat /etc/my.cnf.d/tls/ca-key.pem
ls -l /etc/my.cnf.d/tls
Ответ или решение
При настройке однонаправленной TLS (Transport Layer Security) на сервере MariaDB вы столкнулись с ошибкой валидации серверного сертификата. Данная проблема весьма распространена, особенно при некорректной настройке параметров безопасного соединения. В ответе подробно рассмотрим возможные причины и способы их устранения.
Теория
TLS обеспечивает шифрование данных, передаваемых между клиентом и сервером, тем самым защищая их от перехвата злоумышленниками. При односторонней TLS клиент проверяет подлинность сервера, что требует корректной настройки сертификатов. Сервер MariaDB должен иметь следующие файлы:
- Сертификат сервера (server-cert.pem): он удостоверяет личность сервера.
- Закрытый ключ сервера (server-key.pem): используется для расшифровки данных, зашифрованных с помощью открытого ключа.
- Сертификат доверенного центра сертификации (CA) (ca-cert.pem): удостоверяет подлинность серверного сертификата.
Если серверный сертификат был выдан самоподписанным удостоверяющим центром, клиент должен также получить доступ к правильному CA-сертификату для верификации.
Пример
Ваш текущий подход к настройке состоит из нескольких этапов, начиная с генерации ключей и сертификатов:
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem
openssl req -newkey rsa:2048 -days 365000 -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 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
chown -Rv mysql:root /etc/my.cnf.d/tls/
В конфигурационном файле сервера server.cnf
вы добавили параметры SSL:
ssl-ca=/etc/my.cnf.d/tls/ca-cert.pem
ssl-cert=/etc/my.cnf.d/tls/server-cert.pem
ssl-key=/etc/my.cnf.d/tls/server-key.pem
require_secure_transport=ON
На клиентской стороне вы проходите аутентификацию следующим образом:
ssl_ca = /etc/my.cnf.d/certificates/ca.pem
ssl-verify-server-cert
Существует несколько возможных причин, почему TLS-соединение не удается установить:
-
Путь к CA-сертификату: Вы упомянули различия в пути к CA-сертификату между серверной и клиентской конфигурацией. Убедитесь, что путь в клиентском файле указывает на правильный и доступный сертификат:
ssl_ca = /etc/my.cnf.d/tls/ca-cert.pem ssl-verify-server-cert
-
Разрешения файлов: Проверьте права доступа на файлы сертификатов и ключей. Сертификаты должны быть доступными для чтения клиентом, тогда как закрытый ключ не должен быть доступен. Используйте команды:
cat /etc/my.cnf.d/tls/ca-cert.pem cat /etc/my.cnf.d/tls/ca-key.pem ls -l /etc/my.cnf.d/tls
-
Формат сертификата: Убедитесь, что сертификаты корректны и соответствуют стандартам, используемым OpenSSL. Сертификат может быть поврежден или с неправильными атрибутами, что также может вызвать проблемы валидации.
-
Серийный номер и срок действия: Проверьте, что серийный номер сертификата уникален и что срок его действия не истек.
-
Корректность CA сертификатов: Иногда необходимо удостовериться, что CA-сертификат, используемый для подписи, корректен и присутствует в системных хранилищах доверенных корневых сертификатов, если используется сторонний CA.
Применение
Чтобы устранить проблему и правильно настроить TLS, следуйте этим шагам:
- Перепроверьте пути ко всем файлам SSL как на сервере, так и на клиенте.
- Убедитесь в доступности сертификатов для MariaDB и исправности файлов.
- Пересоздайте сертификаты, если есть сомнения в их корректности.
-
Используйте утилиты для проверки сертификатов и закрытых ключей, чтобы убедиться в их валидности. Например, командой
openssl
можно проверить сертификат:openssl x509 -in /etc/my.cnf.d/tls/server-cert.pem -text -noout
После выполнения всех проверок и исправлений повторите попытку соединения:
mariadb -u test_user -p
TLS – важный аспект безопасности сервера, и его правильная настройка требует внимания к деталям, что включает использование надежных сертификатов, корректных путей и прав доступа. Устранение упомянутых проблем должно позволить вам успешно подключиться к MariaDB с использованием однонаправленной TLS.