Quiero que mi servidor web hable con el servidor de base de datos MySQL a través de una conexión SSL. El servidor web ejecuta CentOS5, el servidor de bases de datos ejecuta FreeBSD. Los certificados son proporcionados por un CA DigiCert intermedio.
MySQL debería estar usando SSL, de acuerdo con my.cnf
:
# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
ssl
ssl-capath = /opt/mysql/pki/CA
ssl-cert = /opt/mysql/pki/server-cert.pem
ssl-key = /opt/mysql/pki/server-key.pem
Cuando inicio MySQL, el demonio comienza sin errores. Esto sugiere que los archivos de certificado son todos legibles.
Pero cuando intento conectarme desde el servidor web al servidor de la base de datos, aparece un error:
[root@webserver ~]# mysql -h mysql.example.org -u user -p
ERROR 2026 (HY000): SSL connection error
Y si trato de depurar más con openssl:
[root@webserver ~]# openssl s_client -connect mysql.example.org:3306 0>/dev/null
CONNECTED(00000003)
15706:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:588:
¿Es esta una forma válida de probar la conexión SSL a un servidor de base de datos MySQL? El SSL23_GET_SERVER_HELLO:unknown protocol
mensaje es extraño, ya que esto es lo que normalmente vería si hablara SSL en un puerto destinado a tráfico no SSL.
Este mismo comando openssl parece funcionar bien con los servidores LDAP y HTTP:
$ openssl s_client -connect ldap.example.org:636 0>/dev/null
CONNECTED(00000003)
depth=2 /C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
...
$ openssl s_client -connect www.example.org:443 0>/dev/null
CONNECTED(00000003)
depth=0 /DC=org/DC=example/OU=Services/CN=www.example.org
Respuestas:
OpenSSL versión 1.1.1 (lanzada el 11 de septiembre de 2018) agregó soporte para
-starttls mysql
in commit a2d9cfbac5d87b03496d62079aef01c601193b58 . Lamentablemente, no puedo encontrar la referencia a esta nueva característica en el registro de cambios de OpenSSL.Si su distribución aún no tiene esta versión, hay un binario de OpenSL compilado estáticamente en https://testssl.sh/openssl-1.0.2k-dev-chacha.pm.ipv6.Linux+FreeBSD.tar.gz que admite
-starttls mysql
. Encontré la referencia en http://www.danneman.org/presentations/Automating_TLS_Configuration_Verification.pdf .Para Windows, los binarios de OpenSSL 1.1.1 se pueden encontrar en https://wiki.openssl.org/index.php/Binaries
Generé los certificados SSL como se describe en https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html , lo intenté y funciona:
También hay
-starttls
soporte para postgres y ldap también en OpenSSL 1.1.1. Consulte https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_client.c#L815-L831 para ver la lista completa.fuente
Respondiendo mi propia pregunta. Si tiene una mejor respuesta con buenas fuentes autorizadas, publique una respuesta.
Respuesta corta; No, OpenSSL no se puede usar para depurar conexiones SSL de MySQL. Esto se debe a que MySQL inicia la sesión usando texto sin formato y luego cambia a SSL.
Al leer https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase.html , MySQL comienza con una conexión de texto sin formato y luego se inicia el SSL real. Esto explica cómo MySQL puede escuchar en un puerto (puerto 3306) para conexiones de texto plano y encriptadas. Compare esto con un servidor HTTP o LDAP, donde se usa un puerto para conexiones de texto sin formato y un segundo puerto para conexiones cifradas.
fuente
Una causa común de este problema es que el nombre común (CN) del certificado de CA es el mismo que el del servidor y / o el certificado del cliente.
Ver aquí: https://dev.mysql.com/doc/refman/5.6/en/creating-ssl-certs.html
Intente volver a crear su CA y certificado (s) y asegúrese de utilizar un CN único en todos los casos.
fuente
Me encuentro con un problema similar con el cliente MacOS X que se comunica con un servidor Ubuntu.
¿Puede verificar si la conexión funcionará si deja de lado el certificado del lado del cliente y la clave del cliente, solo teniendo la CA para el certificado del servidor? ¿Eres capaz de establecer una conexión encriptada? Esto normalmente requerirá CUALQUIER configuración para la columna ssl_type del usuario asociado.
fuente
Solo quería señalar para la posteridad que si desea usar un equilibrador de carga (como un F5 o HAProxy) entre MySQL y el cliente, querrá importar su certificado SSL desde el equilibrador de carga al servidor MySQL. Esto se debe al inicio de la conexión de tipo STARTTLS.
fuente