Неможливо підключитися до mysql, використовуючи самопідписаний сертифікат SSL


15

Після створення самопідписаного сертифіката SSL я налаштував свій віддалений сервер MySQL для їх використання (і SSL увімкнено)

Я сш на свій віддалений сервер і спробую підключитися до власного 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)

Однак я вважаю, що це лише шифрує з'єднання, а не фактично підтверджує дійсність cert (це означає, що я був би потенційно вразливий до атаки "людина-посеред")

Сертифікати 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але з тих пір видалив його, оскільки це не допомогло.


2
Що таке ca.cert? Це сертифікат самопідписаного сервера? Чи використовуєте ви клієнтські сертифікати для аутентифікації? Укажіть конфігурацію, пов’язану з SSL, на сервері.
mgorven

Дякую, я оновив своє запитання з відповіддю та конфігурацією ssl від сервера. Сертифікати, що передаються командному рядку при спробі підключення, дійсно є сертифікатами клієнтів.
carpii

Вплив на це гарне питання. Не заперечуючи, я не впевнений, що має сенс для клієнта вказувати сервери ssl-ca. Але тоді без Ім під імпресією зашифроване з'єднання не буде строго засвідчено
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-ключ під час генерації certs клієнта та сервера)
carpii

Дивно, але для мене це завжди працювало лише одним сертифікатом CA - те саме на клієнті та сервері.
Дмитро Лесков

Так, поки немає спеціальних вимог щодо DN - наприклад, CN є конкретним значенням - тоді ви можете використовувати один і той же ключ і самопідписаний сертифікат на клієнті та сервері.
Кіт Бердіс

3

Щоб використовувати один із способів ssl, слід спробувати:

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

--ssl-certІ --ssl-keyна клієнті тузда використовуються для 2 шляхи SSL. Це означає автентифікацію на основі сертифікатів. Предметом сертифіката клієнта має бути ім'я користувача.


2
Також майте на увазі, що під час з'єднання з сокетом та використання --ssl-verify-server-certCN сертифікат сервера повинен бути таким самим, як і хост, який ви вказали для параметра -h командного рядка.
Кіт Бердіс

0

Ви випадково не ввели одне і те ж загальне ім'я для сервера та клієнтських сертифікатів? Якщо так, замініть один із них, щоб загальні назви були різними.


Для мене рішення Дмитра Лескова спрацювало. За документацією на SSL для MySQL: ( dev.mysql.com/doc/refman/5.0/uk/creating-ssl-certs.html )> Який би метод ви не використовували для створення сертифікатів та ключових файлів, значення загального імені, що використовується для сервера та Клієнтські сертифікати / ключі повинні відрізнятися від значення Загальне ім'я, яке використовується для сертифіката CA. В іншому випадку сертифікати та файли ключів не працюватимуть для серверів, складених за допомогою OpenSSL. Типовою помилкою в цьому випадку є: ПОМИЛКА 2026 (HY000): помилка підключення SSL: помилка: 00000001: lib (0): func (0): причина (1)
gmas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.