UPDATE2
Используя WireShark, я обнаружил строку проблемы (надеюсь, что сделал):
28 | 9.582638 | 192.168.18.128 | 192.168.18.129 | MySQL Response Error 1043
И ошибка (согласно документации ):
Error: 1043 SQLSTATE: 08S01 (ER_HANDSHAKE_ERROR)
Message: Bad handshake
Вот скриншоты WireShark в двух случаях:
Подключение из Windows 8 (Успех):
Подключение от CentOS (Fail):
Почему это происходит?
ОБНОВИТЬ
Одно интересное замечание:
я успешно соединился с Master DB, используя Windows 8 (192.168.18.1)
, изменив настройку ssluser на Master для 192.168.18.1
хоста - сделал изменение: с REQUIRE SSL
на REQUIRE X509
. Однако это не работает в нашем случае с подключением подчиненного устройства.
Я столкнулся с проблемой репликации SSL в CentOS-6.3. Я использую OpenSSL для создания сертификатов клиентов и серверов, а сертификаты клиентов и серверов подписаны одним и тем же центром сертификации.
Server IP: 192.168.18.128
Slave IP: 192.168.18.129
MySQL version 5.1.66 SSL
Все сертификаты, которые я получаю, используют раздел «Настройка SSL-сертификатов и ключей для MySQL» на страницах справки MySQL.
Файл my.cnf сервера :
[mysqld]
ssl-key=/etc/mysql/certs/server-key.pem
ssl-cert=/etc/mysql/certs/server-cert.pem
ssl-ca=/etc/mysql/certs/ca-cert.pem
Клиентский файл my.cnf :
[client]
ssl-ca=/etc/mysql/ssl/ca-cert.pem
ssl-key=/etc/mysql/ssl/client-key.pem
ssl-cert=/etc/mysql/ssl/client-cert.pem
На Master я настраиваю подчиненного пользователя с SSL следующим образом:
CREATE USER 'ssluser'@'192.168.18.129' IDENTIFIED BY 'sslpass';
GRANT REPLICATION SLAVE ON *.* TO 'ssluser'@'192.168.18.129' REQUIRE SSL;
Для обновления Slave я использую следующую команду (в соответствии с show master status
командой):
SLAVE STOP;
CHANGE MASTER TO \
MASTER_HOST='192.168.18.128', \
MASTER_USER='sslreplicant', \
MASTER_PASSWORD='db.sslreplicantprimary', \
MASTER_LOG_FILE='mysql-bin.000026', \
MASTER_LOG_POS=106, \
MASTER_SSL=1, \
MASTER_SSL_CA='/etc/mysql/certs/ca-cert.pem', \
MASTER_SSL_CAPATH='/etc/mysql/certs/', \
MASTER_SSL_CERT='/etc/mysql/certs/client-cert.pem',\
MASTER_SSL_KEY='/etc/mysql/certs/client-key.pem';
SLAVE START;
Сама репликация работает нормально:
mysql> SHOW VARIABLES LIKE '%ssl%';
have_openssl = YES
have_ssl = YES
ssl_ca = /etc/mysql/certs/ca-cert.pem
ssl_capath =
ssl_cert = /etc/mysql/certs/server-cert.pem
ssl_cipher =
ssl_key = /etc/mysql/certs/server-key.pem
Это как на Мастере, так и на Рабе.
Но когда я вручную проверяю соединение между Slave и Master, я получаю сообщение об ошибке.
Вот варианты, которые я пробовал до сих пор (одинаковый результат от всех):
[gahcep@localhost ~]$ mysql -u ssluser -h 192.168.18.128 -p
[gahcep@localhost ~]$ mysql --ssl --ssl-ca=/etc/mysql/certs/ca-cert.pem \
-u ssluser -h 192.168.18.128 -p
[gahcep@localhost ~]$ mysql --ssl-ca=/etc/mysql/certs/ca-cert.pem \
--ssl-cert=/etc/mysql/certs/client-cert.pem \
--ssl-key=/etc/mysql/certs/client-key.pem \
-u ssluser -h 192.168.18.128 -p
Enter password:
ERROR 2026 (HY000): SSL connection error
Действия по воспроизведению:
- настроить / создать сертификаты клиента и сервера, подписанные одним и тем же ок.
- настроить оба файла my.cnf на клиентах и серверах, как указано в этой теме
- создать ssluser на master для рабов
- mysql -u ssluser -h 192.168.18.128 -p
Пожалуйста, обратите внимание, я действительно использовал разные общие имена для всех сертификатов: для CA, клиента и сервера.
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Результаты проверки:
[gahcep@localhost ~]$ sudo openssl verify -purpose sslclient \
-CAfile /etc/mysql/certs/ca-cert.pem /etc/mysql/certs/client-cert.pem
/etc/mysql/certs/client-cert.pem: OK
[gahcep@localhost ~]$ sudo openssl verify -purpose sslserver \
-CAfile /etc/mysql/certs/ca-cert.pem /etc/mysql/certs/server-cert.pem
/etc/mysql/certs/server-cert.pem: OK
Сертификаты информации:
CA:
[gahcep@localhost ~]$ sudo openssl x509 -noout -subject -issuer -dates \
-serial -hash -fingerprint -in /etc/mysql/certs/ca-cert.pem
subject= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=PriSec
issuer= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=PriSec
notBefore=Jan 4 06:27:46 2013 GMT
notAfter=Nov 13 06:27:46 2022 GMT
serial=B45D177E85F99578
c2c5b88b
SHA1 Fingerprint=5B:07:AA:39:28:24:CE:1A:CF:35:FA:14:36:23:65:8F:84:61:B0:1C
Сертификат клиента:
[gahcep@localhost ~]$ sudo openssl x509 -noout -subject -issuer -dates \
-serial -hash -fingerprint -in /etc/mysql/certs/client-cert.pem
subject= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=Secondary
issuer= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=PriSec
notBefore=Jan 4 06:29:07 2013 GMT
notAfter=Nov 13 06:29:07 2022 GMT
serial=01
6df9551f
SHA1 Fingerprint=F5:9F:4A:14:E8:96:26:BC:71:79:43:5E:18:BA:B2:24:BE:76:17:52
Сертификат сервера:
[gahcep@localhost ~]$ sudo openssl x509 -noout -subject -issuer -dates \
-serial -hash -fingerprint -in /etc/mysql/certs/server-cert.pem
subject= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=Primary
issuer= /C=RU/L=Vladivostok/O=Default Company Ltd/CN=PriSec
notBefore=Jan 4 06:28:25 2013 GMT
notAfter=Nov 13 06:28:25 2022 GMT
serial=01
64626d57
SHA1 Fingerprint=39:9E:7A:9E:60:9A:58:68:81:2F:90:A5:9B:BF:E8:26:C5:9D:3C:AB
Справочники Разрешения:
На Мастере:
[gahcep@localhost ~]$ ls -la /etc/mysql/certs/
drwx------. 3 mysql mysql 4096 Jan 3 23:49 .
drwx------. 3 mysql mysql 4096 Jan 3 07:34 ..
-rw-rw-r--. 1 gahcep gahcep 1261 Jan 3 22:27 ca-cert.pem
-rw-rw-r--. 1 gahcep gahcep 1675 Jan 3 22:27 ca-key.pem
-rw-rw-r--. 1 gahcep gahcep 1135 Jan 3 22:28 server-cert.pem
-rw-rw-r--. 1 gahcep gahcep 1679 Jan 3 22:28 server-key.pem
-rw-rw-r--. 1 gahcep gahcep 976 Jan 3 22:28 server-req.pem
На Рабе:
[gahcep@localhost ~]$ ls -la /etc/mysql/certs/
drwx------. 3 mysql mysql 4096 Jan 3 22:57 .
drwx------. 3 mysql mysql 4096 Jan 3 07:50 ..
-rw-r--r--. 1 root root 1261 Jan 3 22:56 ca-cert.pem
-rw-r--r--. 1 root root 1139 Jan 3 22:57 client-cert.pem
-rw-r--r--. 1 root root 1675 Jan 3 22:57 client-key.pem
Если кто-то может предложить решение, я был бы очень признателен за это!
источник
Ответы:
Попробуйте создать файлы сертификатов, принадлежащие пользователю mysql и не доступные для чтения другим.
Вы можете попробовать также с фиксированным шифром:
mysql ... --ssl-cipher=AES128-SHA
И для мастера изменений:
CHANGE MASTER TO ... MASTER_SSL_CIPHER='AES128-SHA'
источник
Возможные решения:
Как определить, использует ли MySQL Server yaSSL или OpenSSL
Это показывает обходной путь отсутствия подходящего значения глобального статуса. Идея состоит в том, чтобы проверить
Rsa_public_key
переменную состояния:Если OpenSSL используется, эта переменная будет существовать; в противном случае это yaSSL.
Другая возможность:
Ошибка подключения к MySQL и SSL ОШИБКА 2026 (HY000) (переполнение стека)
источник
Если вы все перепробовали, но SSL не работает, и в то же время вы запускаете mysqld в chroot, то причина таких ошибок:
или
возможно, вы забыли создать устройства dev / random и dev / urandom в среде chroot (а openssl lib не может получить энтропию - она открывает эти устройства после chroot). Вы можете исправить это следующим образом (замените его
/srv/mysqld
на директорию chroot иmysqld
под пользователем mysqld):источник