Impossible de se connecter à mysql en utilisant un certificat SSL auto-signé

15

Après avoir créé un certificat SSL auto-signé, j'ai configuré mon serveur MySQL distant pour les utiliser (et SSL est activé)

Je ssh dans mon serveur distant, et j'essaye de me connecter à son propre mysqld en utilisant SSL (le serveur MySQL est 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, je me souviens d'avoir lu un problème avec la connexion au même serveur via SSL. Je télécharge donc les clés client dans ma boîte locale et je teste à partir de là ...

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

Il est difficile de savoir à quoi se réfère cette erreur "Erreur de connexion SSL", mais si j'omet le -ssl-ca, je peux me connecter en utilisant 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)

Cependant, je pense que cela ne fait que crypter la connexion, et non pas vérifier la validité du certificat (ce qui signifie que je serais potentiellement vulnérable à une attaque d'homme au milieu)

Les certificats SSL sont valides (bien qu'auto-signés) et ne comportent pas de phrase secrète. Alors ma question est, qu'est-ce que je fais mal? Comment puis-je me connecter via SSL, en utilisant un certificat auto-signé?

La version du serveur MySQL est 5.5.25 et le serveur et les clients sont CentOS 5.

Merci pour tout conseil

Edit : Notez que dans tous les cas, la commande est émise à partir du même répertoire où résident les clés SSL (donc pas de chemin absolu)

Edit (en réponse à mgorven): ca.certest le certificat de l'autorité de certification, qui est censé dire à mysql que mon autorité de certification est approuvée.

La configuration de my.cnfest -

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

J'ai également essayé d'ajouter, ssl-cipher=DHE-RSA-AES256-SHAmais je l'ai supprimé depuis car cela n'a pas aidé.

carpii
la source
2
Qu'est-ce que c'est ca.cert? S'agit-il du certificat auto-signé du serveur? Utilisez-vous des certificats clients pour l'authentification? Veuillez fournir la configuration liée à SSL sur le serveur.
mgorven
Merci, j'ai mis à jour ma question avec la réponse et la configuration SSL du serveur. Les certificats transmis sur la ligne de commande lors de la tentative de connexion sont en effet des certificats clients.
carpii
Enfait c'est une bonne question. Avec le recul, je ne suis pas sûr qu'il soit logique que le client spécifie les serveurs ssl-ca. Mais alors, sans Im sous l'imrepssion, la connexion cryptée n'est pas strictement authentifiée
carpii

Réponses:

12

Oui, vous avez raison: si vous ne le spécifiez pas, --ssl-cale client ne vérifie pas du tout le certificat du serveur. Puisqu'il fonctionne sans cette option, la raison la plus probable de l'échec est que le client ne fait pas confiance au certificat du serveur.

Si vous utilisez des certificats client et serveur auto-signés, le ca.certfichier doit inclure ces deux fichiers. De cette façon, le client fera confiance au certificat de serveur et le serveur fera confiance au certificat de client.

Par exemple:
Générez la clé de serveur et le certificat:

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

Générez la clé client et le certificat:

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

Combinez les certificats client et serveur dans le fichier de certificats CA:

$ cat server-cert.pem client-cert.pem > ca.pem
Keith Burdis
la source
Merci beaucoup! L'étape manquante est que je ne concatène pas les certificats serveur et client dans un ca.pem. Au lieu de cela, je passais le ca.cert qui a été généré initialement (puis passé sous la forme --CA-key lors de la génération des certificats client et serveur)
carpii
Étrange, mais cela a toujours fonctionné pour moi avec un seul certificat CA - le même sur le client et le serveur.
Dmitry Leskov
Oui, tant qu'il n'y a pas d'exigences particulières pour le DN - par exemple le CN étant une valeur spécifique - alors vous pouvez utiliser la même clé et le certificat auto-signé sur le client et le serveur.
Keith Burdis
3

Pour utiliser ssl unidirectionnel, vous devez essayer avec:

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

Le --ssl-certet --ssl-keysur le client mysql sont utilisés pour SSL bidirectionnel. Cela signifie une authentification basée sur un certificat. L'objet du certificat client doit être le nom d'utilisateur.

Mircea Vutcovici
la source
2
Gardez également à l'esprit que lors de l'établissement d'une connexion de socket et de l'utilisation --ssl-verify-server-certdu CN du certificat de serveur doit être le même que l'hôte que vous spécifiez pour l'option de ligne de commande -h.
Keith Burdis
0

Par hasard, n'avez-vous pas entré le même nom commun pour les certificats de serveur et de client? Si oui, remplacez l'un d'eux pour que les noms communs soient différents.

Dmitry Leskov
la source
Pour moi, la solution de Dmitry Leskov a fonctionné. Selon la documentation SSL de MySQL: ( dev.mysql.com/doc/refman/5.0/en/creating-ssl-certs.html )> Quelle que soit la méthode que vous utilisez pour générer le certificat et les fichiers de clés, la valeur du nom commun utilisée pour le serveur et les certificats / clés client doivent chacun différer de la valeur de nom commun utilisée pour le certificat CA. Sinon, les fichiers de certificat et de clé ne fonctionneront pas pour les serveurs compilés à l'aide d'OpenSSL. Une erreur typique dans ce cas est: ERREUR 2026 (HY000): Erreur de connexion SSL: erreur: 00000001: lib (0): func (0): raison (1)
gmas