ACTUALIZACIÓN2
Usando WireShark descubrí la cadena del problema (espero que lo haya hecho):
28 | 9.582638 | 192.168.18.128 | 192.168.18.129 | MySQL Response Error 1043
Y el error es (según los documentos ):
Error: 1043 SQLSTATE: 08S01 (ER_HANDSHAKE_ERROR)
Message: Bad handshake
Aquí están las capturas de pantalla de WireShark en dos casos:
Conexión desde Windows 8 (Correcto):
Conexión desde CentOS (Fail):
¿Por qué pasó esto?
ACTUALIZAR
Un aviso interesante:
me conecté con éxito con Master DB usando Windows 8 (192.168.18.1)
modificando la configuración de ssluser en Master para 192.168.18.1
host; hice un cambio: de REQUIRE SSL
aREQUIRE X509
. Sin embargo, esto no funciona en nuestro caso con la conexión de esclavo a maestro.
Me he enfrentado con un problema de replicación SSL en CentOS-6.3. Estoy usando OpenSSL para crear clientes y certificados de servidor y tanto los clientes como los certificados de servidor están firmados por la misma CA.
Server IP: 192.168.18.128
Slave IP: 192.168.18.129
MySQL version 5.1.66 SSL
Todos los certificados que recibo usando "Configuración de certificados y claves SSL para MySQL" sección de las páginas de ayuda de MySQL.
Archivo my.cnf del servidor :
[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
Archivo my.cnf del cliente :
[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
En Master, configuro un usuario esclavo con SSL como este:
CREATE USER 'ssluser'@'192.168.18.129' IDENTIFIED BY 'sslpass';
GRANT REPLICATION SLAVE ON *.* TO 'ssluser'@'192.168.18.129' REQUIRE SSL;
Para actualizar Slave estoy usando el siguiente comando (según el show master status
comando):
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;
La replicación en sí misma funciona bien:
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
Esto es a la vez: en Master y en Slave.
Pero cuando yo manualmente la conexión de Slave a Master, recibo un error.
Estas son las opciones que probé hasta ahora (el mismo resultado de todos):
[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
Pasos para reproducir:
- configurar / crear clientes y certificados de servidor firmados por el mismo ca.
- configure ambos archivos my.cnf en clientes y servidores como se menciona en este hilo
- crear ssluser en maestro para esclavo
- mysql -u ssluser -h 192.168.18.128 -p
Tenga en cuenta que, de hecho, utilicé diferentes nombres comunes para todos los certificados: para CA, clien y server.
INFORMACIÓN ADICIONAL
Resultados de verificación:
[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
Información de certificados:
CALIFORNIA:
[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
Certificado de cliente:
[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
Certificado de servidor:
[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
Permisos de directorios:
En el maestro:
[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
En esclavo:
[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
Si alguien puede sugerir la solución, ¡realmente lo agradecería!
fuente
Respuestas:
Intente crear archivos de certificados que sean propiedad del usuario mysql y que otros no puedan leer.
Puedes probar también con un cifrado fijo:
mysql ... --ssl-cipher=AES128-SHA
Y para el maestro del cambio:
CHANGE MASTER TO ... MASTER_SSL_CIPHER='AES128-SHA'
fuente
Soluciones posibles:
Cómo saber si MySQL Server usa yaSSL u OpenSSL
Eso muestra una solución alternativa para la falta de un valor de estado global adecuado. La idea es verificar la
Rsa_public_key
variable de estado:Si OpenSSL está en uso, esa variable existirá; de lo contrario es yaSSL.
Otra posibilidad:
Error de conexión MySQL y SSL ERROR 2026 (HY000) (desbordamiento de pila)
fuente
Si probaste todo, pero SSL no funciona, y al mismo tiempo estás ejecutando mysqld en chroot, entonces la causa de los errores como:
o
podría ser que olvidó crear dispositivos dev / random y dev / urandom en el entorno chroot (y openssl lib no puede obtener entropía; abre estos dispositivos después de chroot). Puede solucionarlo de esta manera (reemplace
/srv/mysqld
con su directorio chroot ymysqld
con el usuario en el que se ejecuta mysqld):fuente