No puedo conectarme a mysql usando un certificado SSL autofirmado

15

Después de crear un certificado SSL autofirmado, configuré mi servidor MySQL remoto para usarlos (y SSL está habilitado)

Me conecto a mi servidor remoto e intento conectarme a su propio mysqld usando SSL (el servidor MySQL es 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)

Ok, recuerdo haber leído que hay algún problema con la conexión al mismo servidor a través de SSL. Así que descargo las claves del cliente en mi casilla local y pruebo desde allí ...

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

No está claro a qué se refiere este error de "error de conexión SSL", pero si omito el -ssl-ca, entonces puedo conectarme usando 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)

Sin embargo, creo que esto solo está encriptando la conexión y no verificando realmente la validez del certificado (lo que significa que sería potencialmente vulnerable a un ataque de hombre en el medio)

Los certificados SSL son válidos (aunque autofirmados) y no tienen una frase de contraseña. Entonces mi pregunta es, ¿qué estoy haciendo mal? ¿Cómo puedo conectarme a través de SSL, usando un certificado autofirmado?

La versión del servidor MySQL es 5.5.25 y el servidor y los clientes son CentOS 5.

Gracias por cualquier consejo

Editar : tenga en cuenta que en todos los casos, el comando se emite desde el mismo directorio donde residen las claves SSL (por lo tanto, no hay una ruta absoluta)

Editar (en respuesta a mgorven): ca.certes el certificado de la Autoridad de certificación, que se supone que debe decirle a mysql que mi autoridad de certificación es de confianza.

La configuración de my.cnfes

[mysqld]
ssl-ca=/etc/ssl/mysql/ca.cert
ssl-cert=/etc/ssl/mysql/server.cert
ssl-key=/etc/ssl/mysql/server.key

También intenté agregar ssl-cipher=DHE-RSA-AES256-SHApero lo eliminé porque no ayudó.

carpii
fuente
2
¿Qué es ca.cert? ¿Es el certificado autofirmado del servidor? ¿Está utilizando certificados de cliente para la autenticación? Proporcione la configuración relacionada con SSL en el servidor.
mgorven
Gracias, he actualizado mi pregunta con respuesta y configuración SSL desde el servidor. Los certificados que se pasan en la línea de comandos cuando se intenta conectar son, de hecho, certificados de cliente.
carpii
De hecho, es una buena pregunta. En retrospectiva, no estoy seguro de que tenga sentido que el cliente especifique los servidores ssl-ca. Pero entonces, sin Im bajo la imrepssion la conexión encriptada no es autenticado stricly
carpii

Respuestas:

12

Sí, tiene razón en que si no especifica --ssl-ca, el cliente no verifica el certificado del servidor. Dado que funciona sin esa opción, la razón más probable del error es que el cliente no confía en el certificado del servidor.

Si está utilizando certificados de cliente y servidor autofirmados, el ca.certarchivo debe incluir ambos archivos. De esa manera, el cliente confiará en el certificado del servidor y el servidor confiará en el certificado del cliente.

Por ejemplo:
Genere la clave del servidor y el certificado:

$ 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:

Genere la clave del cliente y el certificado:

$ 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:

Combine los certificados de cliente y servidor en el archivo de certificados de CA:

$ cat server-cert.pem client-cert.pem > ca.pem
Keith Burdis
fuente
¡Muchas gracias! El paso que falta es que no estaba concatenando certificados de servidor y cliente en una ca.pem. En su lugar, estaba pasando el ca.cert que se generó inicialmente (y luego pasó como --CA-key al generar certificados de cliente y servidor)
carpii
Es extraño, pero siempre funcionó para mí con solo un certificado de CA, el mismo en el cliente y el servidor.
Dmitry Leskov
Sí, siempre que no haya requisitos especiales para el DN, por ejemplo, que el CN ​​sea un valor específico, puede usar la misma clave y el certificado autofirmado en el cliente y el servidor.
Keith Burdis
3

Para usar ssl unidireccional, debes probar con:

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

El --ssl-certy --ssl-keyen el cliente mysql se utilizan para SSL de 2 vías. Esto significa autenticación basada en certificados. El tema del certificado del cliente debe ser el nombre de usuario.

Mircea Vutcovici
fuente
2
También tenga en cuenta que al realizar una conexión de socket y utilizar --ssl-verify-server-certel CN ​​del certificado del servidor debe ser el mismo que el host que especifique para la opción de línea de comandos -h.
Keith Burdis
0

Por casualidad, ¿no ha ingresado el mismo nombre común para los certificados de servidor y cliente? En caso afirmativo, reemplace uno de ellos para que los nombres comunes sean diferentes.

Dmitry Leskov
fuente
Para mí, la solución de Dmitry Leskov funcionó. Según la documentación SSL de MySQL: ( dev.mysql.com/doc/refman/5.0/en/creating-ssl-certs.html )> Cualquiera que sea el método que utilice para generar el certificado y los archivos clave, el valor de Nombre común utilizado para el servidor y los certificados / claves de cliente deben diferir del valor de Nombre común utilizado para el certificado de CA. De lo contrario, el certificado y los archivos clave no funcionarán para los servidores compilados con OpenSSL. Un error típico en este caso es: ERROR 2026 (HY000): error de conexión SSL: error: 00000001: lib (0): func (0): reason (1)
gmas