Назад | Перейти на главную страницу

Не удается подключиться к mysql с использованием самоподписанного сертификата SSL

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

Я подключаюсь к своему удаленному серверу по ssh и пытаюсь подключиться к его собственному mysqld, используя SSL (сервер MySQL - 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 - 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 но с тех пор удалили его, так как это не помогло.

Да, вы правы, если не укажете --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

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

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

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

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