Habilitar SSL en MySQL

24

Estoy ejecutando Ubuntu Server 12.04 y quiero habilitar las conexiones SSL a MySQL.

He generado los siguientes archivos de claves / certs con OpenSSL:

  • ca-cert.pem
  • server-cert.pem
  • server-key.pem

Los almacené en /etc/mysql, luego agregué agregué las siguientes líneas a /etc/mysql/my.cnf:

ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem

A continuación, reinicié el servidor con sudo service restart mysql.

Sin embargo, esto no parece habilitar SSL. Dentro de una sesión mysql:

mysql> show variables like '%ssl%';
+---------------+----------------------------+
| Variable_name | Value                      |
+---------------+----------------------------+
| have_openssl  | DISABLED                   |
| have_ssl      | DISABLED                   |
| ssl_ca        | /etc/mysql/ca-cert.pem     |
| ssl_capath    |                            |
| ssl_cert      | /etc/mysql/server-cert.pem |
| ssl_cipher    |                            |
| ssl_key       | /etc/mysql/server-key.pem  |
+---------------+----------------------------+

Alguna idea de lo que me estoy perdiendo? Gracias

visitante93746
fuente
2
Echa un vistazo a este hilo impresionante ... Tal vez podría ayudarte.
SirCharlo
Gracias por el enlace SirCharlo, pero el problema abordado en ese hilo no parece aplicarse a mi situación.
visitante93746
1
Lo que @SirCharlo menciona es dónde quieres mirar. Específicamente la parte de Apparmor y la publicación # 10 . Las claves que he generado en Debian Squeeze o una versión anterior de Ubuntu funcionan bien: la regeneración en 12.04 hace que vuelva a fallar. Vea los registros de errores de MySQL también.
gertvdijk
2
Tenía esta misma pregunta y pasé horas en ella, pero la respuesta de @ user262116 la resolvió. ¡Te animo a aceptar esa respuesta si te ayudó!
elixenida

Respuestas:

33

Ubuntu 12.04 viene con OpenSSL 1.0.1, que tiene valores predeterminados algo diferentes que la versión anterior de OpenSSL 0.9.8.

Entre otras cosas, si está utilizando openssl req -newkey rsa:2048para generar una clave RSA, terminará con una clave en un formato llamado PKCS # 8 . Representadas en el formato PEM, estas claves tienen el -----BEGIN PRIVATE KEY-----encabezado más genérico , que no le dice qué tipo de clave (RSA, DSA, EC) es.

Anteriormente, con OpenSSL 0.9.8, las claves siempre estaban en un formato llamado PKCS # 1 , que representaba como PEM, tenía el encabezado -----BEGIN RSA PRIVATE KEY-----.

Debido a esto, no puede simplemente cambiar el encabezado y pie de página de:

-----BEGIN PRIVATE KEY-----

a

-----BEGIN RSA PRIVATE KEY-----`

No es lo mismo y no funcionará. En su lugar, debe convertir la clave al formato anterior usando openssl rsa. Me gusta esto:

openssl rsa -in key_in_pkcs1_or_pkcs8.pem -out key_in_pkcs1.pem

MySQL (v5.5.35) en Ubuntu 12.04 está utilizando una implementación SSL llamada yaSSL (v2.2.2). Espera que las claves estén en el formato PKCS # 1 y no es compatible con el formato PKCS # 8 utilizado por OpenSSL 1.0 y posteriores. Si simplemente cambia el encabezado y el pie de página, como lo sugieren otras publicaciones en este hilo, MySQL / yaSSL no se quejará, pero no podrá conectarse y, en su lugar, terminará con un error como este:

ERROR 2026 (HY000): SSL connection error: protocol version mismatch

Ubuntu 14.04 viene con OpenSSL 1.0.1f y nuevas configuraciones. Entre otras cosas, generará certificados con resúmenes SHA256 en lugar de SHA1, que se utilizó en versiones anteriores. Incidentalmente, la versión yaSSL incluida con MySQL tampoco es compatible con esto.

Si está generando certificados para usar con MySQL, recuerde asegurarse de que las claves RSA estén convertidas al formato tradicional PKCS # 1 PEM y que los certificados estén utilizando resúmenes SHA1.

Aquí hay un ejemplo de cómo generar su propia CA, un certificado de servidor y un certificado de cliente.

# Generate a CA key and certificate with SHA1 digest
openssl genrsa 2048 > ca-key.pem
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem

# Create server key and certficate with SHA1 digest, sign it and convert
# the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
openssl x509 -sha1 -req -in server-req.pem -days 730  -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
openssl rsa -in server-key.pem -out server-key.pem

# Create client key and certificate with SHA digest, sign it and convert
# the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
openssl rsa -in client-key.pem -out client-key.pem
usuario262116
fuente
1
¡Esta publicación me salvó el día! Fantástica explicación y solución.
generalopinion
Obtuve 'ERROR 2026 (HY000): error de conexión SSL: ASN: antes de la fecha en el futuro'
Nitsan Baleli
Desafortunadamente, todavía recibí los ERROR 2026 (HY000): SSL connection error: protocol version mismatcherrores (usando OpenSSL 1.0.1f). Cambié a OpenSSL 1.0.1e y funcionó con las instrucciones anteriores.
Jarrett
2
Esta respuesta es asombrosa: otorgaría una recompensa masiva si pudiera. Gran explicación del problema.
elixenide
Otra voz para agregar a la horda. He estado rastreando Internet tratando de encontrar una solución a por qué la configuración documentada de MySQL simplemente no funcionaría: la parte inferior de esta publicación me salvó por completo el día.
Steve Chambers
4

Esto me ayudó a:

El encabezado y pie de página del archivo server-key.pem se veía así:

-----BEGIN PRIVATE KEY-----
...
...
-----END PRIVATE KEY-----

Pero requiere algo así:

-----BEGIN RSA PRIVATE KEY-----
...
...
-----END RSA PRIVATE KEY-----

Tenga en cuenta la CLAVE PRIVADA BEGIN RSA

Para ver el registro:

sudo vim /var/log/mysql/error.log

Espero que esto ayude.

usuario194410
fuente
Tuve un problema similar en mi Ubunbtu 12.04 con mysql 5.5.34, donde todos los archivos pem eran legibles por todos y todavía me daban el mismo problema. Pero esta respuesta combinada con el cambio de propietario hizo el truco.
Tommy Andersen
No agregue manualmente "RSA" : esto solo suprimirá el error, pero SSL no funcionará (obtendrá otro error, " Error de conexión SSL: no coinciden las versiones del protocolo "). Convierta el formato PKCS # 8 al formato PKCS # 1 en su lugar utilizandoopenssl rsa
rustyx
3

Tuve los mismos problemas en 12.04, pero en realidad fue una aparición lo que causó los problemas.

Encontré una solución en los foros de Ubuntu , moviendo .pemarchivos en /etc/mysqlresuelto.

También puede cambiar la configuración de apparmor en /etc/apparmor.d/usr.sbin.mysqld.

usuario273610
fuente
Este fue el problema que tuve también
Jonathan
¿Es eso un error tipográfico? ¿te refieres a "mover archivos pem a" en lugar de "mover archivos pem"? Perdón por ser tan pedante, pero me confundí un poco
Knocte
1

Asegúrese de que el usuario que ejecuta el proceso mysqld tenga acceso de lectura a las claves y los archivos de certificado. Si inicia MySQL utilizando la cuenta "mysql", debería:

/etc/mysql$ chown mysql:mysql *.pem
/etc/mysql$ ls -l *.pem
-rwxrwx--- 1 mysql mysql 1631 2013-09-16 14:27 ca-cert.pem
-rwxrwx--- 1 mysql mysql 1281 2013-09-16 14:27 server-cert.pem
-rwxrwx--- 1 mysql mysql 1679 2013-09-16 14:27 server-key.pem

De lo contrario, puede obtener lo siguiente en su registro de errores:

SSL error: Unable to get certificate from '/etc/mysql/server-cert.pem'
130916 13:32:25 [Warning] Failed to setup SSL
130916 13:32:25 [Warning] SSL error: Unable to get certificate
Isabi
fuente
Excelente. Pero, ¿cómo podría hacerse esto? Tómese un tiempo y explique más, dando más información :)
Lucio
Esto combinado con la adición de RSA al archivo server-key.pem hizo el truco.
Tommy Andersen
1

En Ubuntu 16.04, ejecuté mysql_ssl_rsa_setup, pude ver los archivos en show variables como en la pregunta, pero have_ssly seguí have_opensslsiéndolo DISABLED.

La solución fue a chown mysql.mysql /var/lib/mysql/*.pem. Alternativamente, supongo que si ejecuta mysql_ssl_rsa_setup como usuario de mysql, creará los archivos con los permisos correctos.

Craig Wright
fuente
La pregunta tiene cuatro años y dos meses ... Es poco probable que el OP responda a su respuesta.
WinEunuuchs2Unix
1
Publiqué esto simplemente como un servicio para futuros lectores porque este es uno de los principales resultados de búsqueda de Google para este problema y nada de lo que leí ayudó a resolver mi problema. El valor de esta respuesta que se refiere al estado del mundo en Ubuntu 12.04 e incluso 14.04 está perdiendo relevancia.
Craig Wright,
@ WinEunuuchs2Unix Quizás no sea el OP, pero aquí estoy, casi dos años después, buscando exactamente esta respuesta. Entonces, gracias Craig!
Oldskool
0

El archivo de clave privada debería verse (formato PKCS # 1):

-----BEGIN RSA PRIVATE KEY-----
. . .
-----END RSA PRIVATE KEY-----

Si su clave privada comienza con:

-----BEGIN PRIVATE KEY-----

(Formato PKCS # 8), entonces debe convertirlo así:

openssl rsa -in server-key.pem -out server-key.pem

No agregue manualmente la RSAetiqueta " " que falta "" , porque el formato es diferente.

rustyx
fuente
-1

Las opciones de inicio de SSL deben estar cerca de la parte superior de su archivo my.cnf o pueden ignorarse. Tuve problemas al ejecutar mysql 5.6 en RHEL 6.4 donde las variables SSL se ignoraban, las tenía al final del archivo my.cnf. Los moví en la parte superior del archivo (justo debajo de [mysqld]), luego reinicié el servidor y todo estuvo bien.

Christine
fuente