Задавайте вопросы, мы ответим
Вы не зашли.
Привет. Обращаюсь с вопросом об установке шифрованного подключения по SSL к серверу MySQL. Прочитал немного информации на эту тему и действовал по имеющимся инструкциям, но создать такое подключение не удалось. Здесь есть только одна тема посвященная этому http://sqlinfo.ru/forum/viewtopic.php?id=1901 но в ней недостаточно информации для решения проблемы. Для Windows примера успешного создания такого подключения вообще не нашел. Надеюсь на вашу помощь.
Сразу извиняюсь за лишние подробности, но не хочу ничего опускать в описании процесса.
Используемое ПО:
Операционка : Windows Server 2003
Сервер MySQL : версия 5.5.5-m3
Генератор сертификатов : OpenSSL for Windows
OpenSSL for Windows скачан по ссылке http://www.openssl.org/related/binaries.html
=========================================
Этап 1: Проверка поддержки SSL сервером MySQL
Согласно инструкциям ttp://dev.mysql.com/doc/refman/5.0/en/secure-using-ssl.html , проверяю поддерживает ли MySQL сервер SSL соединения.
> mysqld --ssl --help
Сообщения "[ERROR] mysqld: unknown option '--ssl'" НЕ появляется, значит SSL поддерживается. После подключения к серверу MySQL проверяю значение системной переменной "have_ssl" . Значение равно "DISABLED". Значит сервер поддерживает SSL, но был запущен без необходимых опций --ssl-xxx.
Согласно инструкции с той же страницы для того чтобы переменная "have_ssl" при запуске имела значение "YES" необходимо при старте сервера MySQL указать эти ключи так:
> mysqld --ssl-ca=ca-cert.pem --ssl-cert=server-cert.pem --ssl-key=server-key.pem
Установливаю OpenSSL for Windows и добавляю путь к каталогу bin в переменную PATH операционки
Далее действую по инструкции со страницы http://dev.mysql.com/doc/refman/5.0/en/ … certs.html
Создаю каталог c:\cert и устанавливаю его как текущий
=========================================
Этап 2: Создание сертификатов CA
ПЕРВАЯ КОМАНДА:
--------------
> openssl genrsa 2048 > ca-key.pem
Создается файл ca-key.pem, на экран выводится следующий текст, сообщающий о том что приватный RSA ключ создан:
Loading 'screen' into random state - done
Generating RSA private key, 2048 bit long modulus
.............................+++
............+++
e is 65537 (0x10001)
ВТОРАЯ КОМАНДА:
---------------
> openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem
Тут на эран выводится информация.
Loading 'screen' into random state - done
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
И далее предложение ввести код страны (ставлю RU). Области (ставлю State) . Города (ставлю City). Имя организации (ставлю HomeCA). Подразделения организации (ставлю Unit). Общее имя (ставлю NameCA). Адрес почты (ставлю ca@mail.ru). Итого ввод данных выглядит так:
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:State
Locality Name (eg, city) []:City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:HomeCA
Organizational Unit Name (eg, section) []:Unit
Common Name (eg, YOUR name) []:NameCA
Email Address []:ca@mail.ru
ЗДЕСЬ ХОЧУ УТОЧНИТЬ. В первом комментарии на странице http://dev.mysql.com/doc/refman/5.0/en/ … certs.html сказано что "4) Create your client key. Make sure your commonName is *different* from that of your server. They must be unique."
Почему эти имена должны различаться мне не понятно. Но если есть совет сделать их различными - сделаем их разными для клиента, сервера и CA.
=========================================
Этап 3: Создание сертификатов сервера
ПЕРВАЯ КОМАНДА:
--------------
> openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
На экран выводится информация подобная той что выводилась после второй команды при создании сертификатов CA.
Затем снова просят задать даные для сертефиката. Задаю те же данные, что и в прошлый раз за исключением имени огранизации, почты и общего имени.
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:State
Locality Name (eg, city) []:City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:HomeServer
Organizational Unit Name (eg, section) []:Unit
Common Name (eg, YOUR name) []:NameServer
Email Address []:server@mail.ru
ДАЛЕЕ ПРОСЯТ ВВЕСТИ ПАРОЛЬ. ЧЕТКИХ ИНСТРУКЦИЙ О ТОМ КАКИМ ОН ДОЛЖЕН БЫТЬ И ГДЕ ЕГО ПОТОМ СПРАШИВАЮТ НЕ НАШЕЛ.
Задаю пароль "passowrd":
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []:optional company name
ВТОРАЯ КОМАНДА:
---------------
> openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
Вывод команды следующий:
Loading 'screen' into random state - done
Signature ok
subject=/C=RU/ST=State/L=City/O=HomeServer/OU=Unit/CN=NameServer/emailAddress=server@mail.ru
Getting CA Private Key
В результате имеем файлы: server-req.pem, server-key.pem, server-cert.pem
=========================================
Этап 4: Создание сертификатов клиента
ПЕРВАЯ КОМАНДА:
--------------
> openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
Снова просят ввести данные. Общее имя указываю отличное от общего имени сервера, а именно NameClient. Пароль указывают тот же, что и при создании сертификатов сервера, то есть password:
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:State
Locality Name (eg, city) []:City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:HomeClient
Organizational Unit Name (eg, section) []:Unit
Common Name (eg, YOUR name) []:NameClient
Email Address []:client@mail.ru
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:passowrd
An optional company name []:optional company name
ВТОРАЯ КОМАНДА:
---------------
> openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
Вывод команды следующий:
Loading 'screen' into random state - done
Signature ok
subject=/C=RU/ST=State/L=City/O=HomeClient/OU=Unit/CN=NameClient/emailAddress=client@mail.ru
Getting CA Private Key
В результате выполнения команд создаются файлы client-req.pem, client-key.pem, client-cert.pem
=========================================
Этап 5: Подключение созанных сертификатов к MySQL серверу
Использую информацию из комментария по всё той же ссыке:
In order to run MySQL as Service on Windows platform with SSL enabled just add this lines in [mysqld] section:
ssl-key=C:/cert/server-key.pem
ssl-cert=C:/cert/server-cert.pem
ssl-ca=C:/cert/ca-cert.pem
Останавливаю сервер
C:\cert>net stop mysql
The MySQL service is stopping..
The MySQL service was stopped successfully.
Открываю mysql.ini и добаляю в секцию [mysqld] строки
ssl-key=C:/cert/server-key.pem
ssl-cert=C:/cert/server-cert.pem
ssl-ca=C:/cert/ca-cert.pem
Заново запускаю сервер MySQL любой из команд "net start mysql" или просто "mysqld" - результат один и тот же.
Переменная have_ssl по прежнему равна DISABLED.
============================================
Итоги:
На сколько я понимаю пока переменная have_ssl не станет равна YES что-то еще делать нет смылса.
Пробовал добавить в mysql.ini строку ssl:
[mysqld]
ssl
ssl-key=C:/cert/server-key.pem
ssl-cert=C:/cert/server-cert.pem
ssl-ca=C:/cert/ca-cert.pem
Это не помогло. Пробовал запускать mysqld с ключами
mysqld --ssl-key=C:/cert/server-key.pem --ssl-cert=C:/cert/server-cert.pem --ssl-ca=C:/cert/ca-cert.pem
Переменные всё те же
+---------------+-------------------------+
| Variable_name | Value |
+---------------+-------------------------+
| have_openssl | DISABLED |
| have_ssl | DISABLED |
| ssl_ca | C:/cert/ca-cert.pem |
| ssl_capath | |
| ssl_cert | C:/cert/server-cert.pem |
| ssl_cipher | |
| ssl_key | C:/cert/server-key.pem |
+---------------+-------------------------+
Пробовал менять слеши на обратные и брать пути к сертификатам в кавычки - не помогло. Результат тот же.
Задавал пустой пароль при создании сертификатов клиента и сервера - не помогло. В любом случае пароль здесь скорее всего не влияет на переменные have_openssl и have_ssl.
Неактивен
Пароль безусловно влияет, т.к. серверу нужно проверить, что ключ
подходит к сертификату. А для чтения ключа нужен пароль.
А что написно в журнале ошибок MySQL? Там пишутся строки при
неудачной инициализации SSL.
Неактивен
Действительно, вот все строки касающиеся SSL из лога:
SSL error: Unable to get private key from 'C:/cert/server-key.pem'
100827 19:12:49 [Warning] Failed to setup SSL
100827 19:12:49 [Warning] SSL error: Unable to get private key
100827 19:12:53 [Note] Event Scheduler: Loaded 3 events
100827 19:12:53 [Note] mysqld: ready for connections.
Version: '5.5.5-m3' socket: '' port: 3306 MySQL Community Server (GPL)
Не удается получить приватный ключ.
Возможно все-таки заданный пароль к этому файлу надо указывать? Но как и где его указывать?
При создании файла server-key.pem я указывал пароль "password" и также пробовал оставлять это поле пустым:
A challenge password []:password
An optional company name []:optional company name
Возможно надо было не осталять его пустым а ставить точку, как это было написано в выводах openssl : "If you enter '.', the field will be left blank."
Но если пароль уже задан, то как его указать?
Неактивен
Повторил действия, но при задании пароля для server-key.pem вместо пароля поставил точку ".".
Вывод ошибок в лог тот же самый.
Неактивен
Нее, это не тот пароль. Смотрите пароль на файле с ключом. Если пароля нет
(то, что нужно получить), то он должен начинаться как-то так:
-----BEGIN RSA PRIVATE KEY-----
Если там вписано шифрование (DES, AES, etc), то значит личный ключ находится
под паролем, и тогда надо его расшифровать.
Неактивен
Нашел инофрмцию о баге в MySQL которая вроде бы и не бага ))
http://bugs.mysql.com/bug.php?id=48881
Сертефикат для сервера MySQL должен быть без пароля. Попробую разобраться как его снять.
----------------------------------
Снимается пароль командами:
openssl rsa -in server-key.pem -out server-key.pem
и
openssl rsa -in client-key.pem -out client-key.pem
После этого переменные have_ssl и have_openssl становятся равны YES.
Отредактированно rain82 (27.08.2010 15:08:21)
Неактивен
Жаль, что Вы не прочитали мое сообщение
Неактивен
Теперь прочитал )) Дальше буду разбираться с подключением клиента.
Спасибо за подсказки!
----------------------------------------------------------
Для установки полключения клиента командой
mysql --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -u root -p
также достаточно сбросить пароль выполнив
openssl rsa -in client-key.pem -out client-key.pem
Всё работает, но с OpenSSL конечно надо разбираться - куча тонкостей.
Отредактированно rain82 (27.08.2010 15:26:11)
Неактивен