Je veux que mon serveur Web parle au serveur de base de données MySQL via une connexion SSL. Le serveur Web exécute CentOS5, le serveur de base de données exécute FreeBSD. Les certificats sont fournis par un CA DigiCert intermédiaire.
MySQL devrait utiliser ssl, selon 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
Lorsque je démarre MySQL, le démon démarre sans erreur. Cela suggère que les fichiers de certificat sont tous lisibles.
Mais lorsque j'essaie de me connecter du serveur Web au serveur de base de données, j'obtiens une erreur:
[root@webserver ~]# mysql -h mysql.example.org -u user -p
ERROR 2026 (HY000): SSL connection error
Et si j'essaye de déboguer plus avant avec 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:
Est-ce un moyen valide de tester la connexion SSL à un serveur de base de données MySQL? Le SSL23_GET_SERVER_HELLO:unknown protocol
message est étrange car c'est généralement ce que vous verriez si vous parliez SSL sur un port destiné au trafic non SSL.
Cette même commande openssl semble fonctionner correctement avec les serveurs LDAP et 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
Réponses:
OpenSSL version 1.1.1 (publié le 11 septembre 2018) a ajouté la prise
-starttls mysql
en charge de la validation dans a2d9cfbac5d87b03496d62079aef01c601193b58 . Malheureusement, je ne trouve pas la référence à cette nouvelle fonctionnalité dans le changelog OpenSSL.Si votre distribution n'a pas encore cette version, il existe un binaire openssl compilé statiquement à https://testssl.sh/openssl-1.0.2k-dev-chacha.pm.ipv6.Linux+FreeBSD.tar.gz qui prend en charge
-starttls mysql
. J'en ai trouvé la référence dans http://www.danneman.org/presentations/Automating_TLS_Configuration_Verification.pdf .Pour Windows, les binaires OpenSSL 1.1.1 peuvent être trouvés sur https://wiki.openssl.org/index.php/Binaries
J'ai généré les certificats SSL comme décrit dans https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html , essayé et cela fonctionne:
Il existe également un
-starttls
support pour postgres et ldap dans OpenSSL 1.1.1. Voir https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_client.c#L815-L831 pour la liste complète.la source
Répondre à ma propre question. Si vous avez une meilleure réponse avec de bonnes sources faisant autorité, veuillez poster une réponse.
Réponse courte; Non, OpenSSL ne peut pas être utilisé pour déboguer les connexions SSL MySQL. En effet, MySQL démarre la session en utilisant du texte en clair et passe ensuite à SSL.
En lisant https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase.html , MySQL démarre avec une connexion en clair, puis le SSL réel est ensuite initié. Cela explique comment MySQL est capable d'écouter sur un port (port 3306) à la fois les connexions en clair et les connexions cryptées. Comparez cela à un serveur HTTP ou LDAP, où un port est utilisé pour les connexions en texte brut et un second port est utilisé pour les connexions cryptées.
la source
Une cause courante de ce problème est que le nom commun (CN) du certificat CA est le même que le certificat serveur et / ou client.
Voir ici: https://dev.mysql.com/doc/refman/5.6/en/creating-ssl-certs.html
Essayez de recréer votre CA et vos certificats et assurez-vous d'utiliser un CN unique dans tous les cas.
la source
Je rencontre un problème similaire avec le client MacOS X communiquant avec un serveur Ubuntu.
Pouvez-vous vérifier si la connexion fonctionnera si vous omettez le certificat côté client et la clé client, simplement en ayant l'AC pour le certificat de serveur? Pouvez-vous établir une connexion cryptée? Cela nécessite normalement le paramètre ANY pour la colonne ssl_type de l'utilisateur associé.
la source
Je voulais juste noter pour la postérité que si vous souhaitez utiliser un équilibreur de charge (comme un F5 ou HAProxy) entre MySQL et le client, vous voudrez importer votre certificat SSL de l'équilibreur de charge dans le serveur MySQL. Cela est dû au démarrage de la connexion de type STARTTLS.
la source