Не могу подключиться к MySQL, используя самозаверяющий сертификат SSL

15

После создания самозаверяющего SSL-сертификата я настроил свой удаленный сервер MySQL для их использования (и SSL включен)

Я захожу по ssh на свой удаленный сервер и пытаюсь подключиться к его собственному mysqld с помощью SSL (MySQL server - 5.5.25).

mysql -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key --ssl-ca=ca.cert
Enter password: 
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)

Хорошо, я помню, что читал некоторые проблемы с подключением к тому же серверу через SSL. Поэтому я загружаю клиентские ключи в свою локальную коробку и тестирую оттуда ...

mysql -h <server> -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key --ssl-ca=ca.cert 
Enter password: 
ERROR 2026 (HY000): SSL connection error

Непонятно, к чему относится ошибка «Ошибка соединения SSL», но если я ее опущу -ssl-ca, я смогу подключиться с использованием SSL.

mysql -h <server> -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.5.25 MySQL Community Server (GPL)

Тем не менее, я считаю, что это только шифрование соединения, а не проверка подлинности сертификата (это означает, что я буду потенциально уязвим к атаке «человек посередине»)

Сертификаты SSL действительны (хотя и самозаверяющие) и не имеют парольной фразы. Итак, мой вопрос, что я делаю не так? Как я могу подключиться через SSL, используя самозаверяющий сертификат?

Версия MySQL Server - 5.5.25, а сервер и клиенты - CentOS 5.

Спасибо за любой совет

Изменить : Обратите внимание, что во всех случаях команда запускается из того же каталога, в котором находятся ключи ssl (следовательно, без абсолютного пути)

Изменить (в ответ на mgorven): ca.certэто сертификат центра сертификации, который должен сообщать mysql, что моему центру сертификации доверяют.

Конфиг из my.cnfесть

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

Я также попытался добавить, ssl-cipher=DHE-RSA-AES256-SHAно с тех пор удалил это, поскольку это не помогло.

carpii
источник
2
Что такое ca.cert? Это самозаверяющий сертификат сервера? Вы используете клиентские сертификаты для аутентификации? Пожалуйста, предоставьте конфигурацию, связанную с SSL, на сервере.
mgorven
Спасибо, я обновил свой вопрос ответом и конфигурацией ssl с сервера. Сертификаты, передаваемые в командной строке при попытке подключения, действительно являются клиентскими сертификатами.
carpii
Infact это хороший вопрос. Оглядываясь назад, я не уверен, что для клиента имеет смысл указывать серверы ssl-ca. Но тогда без Im под впечатлением зашифрованное соединение не будет строго аутентифицировано
carpii

Ответы:

12

Да, вы правы, если вы не укажете, --ssl-caто клиент вообще не проверяет сертификат сервера. Поскольку он работает без этой опции, наиболее вероятной причиной сбоя является то, что клиент не доверяет сертификату сервера.

Если вы используете самозаверяющие клиентские и серверные сертификаты, тогда ca.certфайл должен включать оба этих файла. Таким образом, клиент будет доверять сертификату сервера, а сервер будет доверять сертификату клиента.

Например:
сгенерируйте ключ сервера и сертификат:

$ openssl req -x509 -newkey rsa:1024 \
         -keyout server-key-enc.pem -out server-cert.pem \
         -subj '/DC=com/DC=example/CN=server' -passout pass:qwerty

$ openssl rsa -in server-key-enc.pem -out server-key.pem \
         -passin pass:qwerty -passout pass:

Сгенерируйте клиентский ключ и сертификат:

$ openssl req -x509 -newkey rsa:1024 \
         -keyout client-key-enc.pem -out client-cert.pem \
         -subj '/DC=com/DC=example/CN=client' -passout pass:qwerty

$ openssl rsa -in client-key-enc.pem -out client-key.pem \
         -passin pass:qwerty -passout pass:

Объедините сертификаты клиента и сервера в файл сертификатов CA:

$ cat server-cert.pem client-cert.pem > ca.pem
Кит Бурдис
источник
Спасибо огромное! Пропущенный шаг заключается в том, что я не объединял серверные и клиентские сертификаты в ca.pem. Вместо этого я передавал ca.cert, который был сгенерирован изначально (а затем передан как --CA-ключ при генерации сертификатов клиента и сервера)
carpii
Странно, но это всегда работало для меня только с одним сертификатом CA - то же самое на клиенте и сервере.
Дмитрий Лесков
Да, если для DN нет особых требований - например, CN - это конкретное значение, - вы можете использовать один и тот же ключ и самозаверяющий сертификат на клиенте и сервере.
Кит Бурдис
3

Чтобы использовать один способ ssl, вы должны попробовать:

mysql -u <user> -p --ssl=1 --ssl-ca=ca.cert --ssl-verify-server-cert

The --ssl-certи --ssl-keyна клиенте mysql используются для двухстороннего SSL. Это означает аутентификацию на основе сертификатов. Предметом сертификата клиента должно быть имя пользователя.

Мирча Вуцовичи
источник
2
Также имейте в виду, что при создании соединения через сокет и использовании --ssl-verify-server-certCN сертификата сервера он должен совпадать с хостом, указанным для параметра командной строки -h.
Кит Бурдис
0

Случайно, вы не ввели одно и то же общее имя для сертификатов сервера и клиента? Если да, замените одно из них, чтобы общие имена были другими.

Дмитрий Лесков
источник
Для меня решение Дмитрия Лескова сработало. Согласно документации MySQL по SSL: ( dev.mysql.com/doc/refman/5.0/en/creating-ssl-certs.html )> Какой бы метод вы ни использовали для генерации файлов сертификата и ключа, значение Common Name, используемое для сервера и клиентские сертификаты / ключи должны отличаться от значения общего имени, используемого для сертификата CA. В противном случае файлы сертификатов и ключей не будут работать на серверах, скомпилированных с использованием OpenSSL. Типичная ошибка в этом случае: ОШИБКА 2026 (HY000): ошибка соединения SSL: ошибка: 00000001: lib (0): func (0): причина (1)
gmas