Activer SSL dans MySQL

24

J'utilise Ubuntu Server 12.04 et je souhaite activer les connexions SSL à MySQL.

J'ai généré les fichiers de clés / certificats suivants avec OpenSSL:

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

Je les ai stockés à /etc/mysql, puis j'ai ajouté les lignes suivantes à /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

Ensuite, j'ai redémarré le serveur avec sudo service restart mysql.

Cependant, cela ne semble pas activer SSL. Dans une session 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  |
+---------------+----------------------------+

Des idées sur ce qui me manque? Merci

visiteur93746
la source
2
Découvrez ce fil génial .. Peut-être que cela pourrait vous aider.
SirCharlo
Merci pour le lien SirCharlo, mais le problème abordé dans ce fil ne semble pas s'appliquer à ma situation.
visitor93746
1
Ce que @SirCharlo mentionne, c'est où vous voulez regarder. Plus précisément la partie Apparmor et le poste # 10 . Les clés que j'ai générées sur Debian Squeeze ou une ancienne version d'Ubuntu fonctionnent bien - la régénération en 12.04 la fait échouer à nouveau. Voir également les journaux d'erreurs MySQL.
gertvdijk
2
J'ai eu cette même question et j'ai passé des heures dessus, mais la réponse de @ user262116 l'a résolue. Je vous encourage à accepter cette réponse si cela vous a aidé!
elixenide du

Réponses:

33

Ubuntu 12.04 est livré avec un OpenSSL 1.0.1, qui a des valeurs par défaut quelque peu différentes de l'ancienne version d'OpenSSL 0.9.8.

Entre autres choses, si vous utilisez openssl req -newkey rsa:2048pour générer une clé RSA, vous vous retrouverez avec une clé dans un format appelé PKCS # 8 . Représentées au format PEM, ces clés ont l'en- -----BEGIN PRIVATE KEY-----tête plus générique , qui ne vous indique pas de quel type de clé (RSA, DSA, EC) il s'agit.

Auparavant, avec OpenSSL 0.9.8, les clés étaient toujours dans un format appelé PKCS # 1 , qui représentait PEM, avait l'en-tête -----BEGIN RSA PRIVATE KEY-----.

Pour cette raison, vous ne pouvez pas simplement changer l'en-tête et le pied de page de:

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

à

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

Ce n'est pas la même chose et ça ne marchera pas. Au lieu de cela, vous devez convertir la clé dans l'ancien format à l'aide de openssl rsa. Comme ça:

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

MySQL (v5.5.35) sur Ubuntu 12.04 utilise une implémentation SSL appelée yaSSL (v2.2.2). Il s'attend à ce que les clés soient au format PKCS # 1 et ne prennent pas en charge le format PKCS # 8 utilisé par OpenSSL 1.0 et plus récent. Si vous modifiez simplement l'en-tête et le pied de page, comme suggéré par d'autres articles de ce fil, MySQL / yaSSL ne se plaindra pas, mais vous ne pourrez pas vous connecter et vous retrouverez à la place avec une erreur comme celle-ci:

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

Ubuntu 14.04 est livré avec OpenSSL 1.0.1f et de nouveaux paramètres. Entre autres choses, il générera des certificats avec des résumés SHA256 au lieu de SHA1, qui était utilisé dans les versions antérieures. Soit dit en passant, la version yaSSL fournie avec MySQL ne prend pas cela en charge non plus.

Si vous générez des certificats à utiliser avec MySQL, n'oubliez pas de vous assurer que les clés RSA sont converties au format PEM PKCS # 1 traditionnel et que les certificats utilisent des résumés SHA1.

Voici un exemple de génération de votre propre autorité de certification, d'un certificat de serveur et d'un certificat client.

# 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
user262116
la source
1
Ce message m'a sauvé la journée! Fantastique explication et solution.
opinion générale du
J'ai 'ERREUR 2026 (HY000): Erreur de connexion SSL: ASN: avant la date à venir'
Nitsan Baleli
Malheureusement, j'ai toujours les ERROR 2026 (HY000): SSL connection error: protocol version mismatcherreurs (en utilisant OpenSSL 1.0.1f). Je suis passé à OpenSSL 1.0.1e et cela a fonctionné avec les instructions ci-dessus.
Jarrett
2
Cette réponse est incroyable - accorderait une prime massive si je le pouvais. Grande explication du problème.
elixenide
Une autre voix à ajouter à la horde. J'ai parcouru Internet en essayant de trouver une solution pour expliquer pourquoi la configuration documentée de MySQL ne fonctionnerait tout simplement pas - la partie inférieure de ce message m'a complètement sauvé la journée.
Steve Chambers
4

Cela m'a aidé:

L'en-tête et le pied de page du fichier server-key.pem ressemblaient à ça:

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

Mais cela nécessite quelque chose comme ça:

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

Notez la clé privée BEGIN RSA

Pour voir le journal:

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

J'espère que cela t'aides.

user194410
la source
J'ai eu un problème similaire dans mon Ubunbtu 12.04 avec mysql 5.5.34, où les fichiers pem avaient tous été lisibles par tous et m'ont toujours posé le même problème. Mais cette réponse combinée avec le changement de propriétaire a fait l'affaire.
Tommy Andersen
N'ajoutez pas manuellement "RSA" - cela ne fera que supprimer l'erreur, mais SSL ne fonctionnera pas (vous obtiendrez une autre erreur, " Erreur de connexion SSL: incompatibilité de version de protocole "). Convertissez du format PKCS # 8 au format PKCS # 1 à la place en utilisantopenssl rsa
rustyx
3

J'ai eu les mêmes ennuis le 12.04 mais c'est en fait l'apparmeur qui a causé les problèmes.

J'ai trouvé une solution sur les forums Ubuntu , en déplaçant les .pemfichiers dans la /etc/mysqlrésolution.

Vous pouvez également modifier la configuration de l'apparmeur dans /etc/apparmor.d/usr.sbin.mysqld.

user273610
la source
C'était aussi le problème que j'avais
Jonathan
est-ce une faute de frappe? voulez-vous dire "déplacer des fichiers pem vers" au lieu de "déplacer des fichiers pem dans"? désolé d'être si pédant mais je suis un peu confus
knocte
1

Assurez-vous que l'utilisateur exécutant le processus mysqld dispose d'un accès en lecture aux clés et aux fichiers de certificat. Si vous lancez MySQL en utilisant le compte "mysql", vous devez:

/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

Sinon, vous pourriez obtenir les informations suivantes dans votre journal des erreurs:

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
la source
Génial. Mais comment cela pourrait-il être fait? Prenez le temps et expliquez plus loin, en donnant plus d'informations :)
Lucio
Cela combiné à l'ajout de RSA au fichier server-key.pem a fait l'affaire.
Tommy Andersen
1

Sur Ubuntu 16.04, j'ai couru, je mysql_ssl_rsa_setuppouvais voir les fichiers dans les variables show comme dans la question, mais have_sslet j'ai have_opensslcontinué à l'être DISABLED.

La solution était de chown mysql.mysql /var/lib/mysql/*.pem. Alternativement, je suppose que si vous exécutez mysql_ssl_rsa_setup en tant qu'utilisateur mysql, il créera les fichiers avec les autorisations appropriées.

Craig Wright
la source
La question a quatre ans et deux mois ... Il est peu probable que le PO réponde à votre réponse.
WinEunuuchs2Unix
1
J'ai posté cela simplement comme un service pour les futurs lecteurs, car c'est l'un des meilleurs résultats de recherche Google pour ce problème et rien de ce que j'ai lu n'a aidé à résoudre mon problème. La valeur de cette réponse se référant à l'état du monde dans Ubuntu 12.04 et même 14.04 perd de sa pertinence.
Craig Wright
@ WinEunuuchs2Unix Peut-être pas l'OP, mais me voici, presque deux ans plus tard, à la recherche de cette réponse. Alors, merci Craig!
Oldskool
0

Le fichier de clé privée doit ressembler à (format PKCS # 1):

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

Si votre clé privée commence à la place par:

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

(Format PKCS # 8), alors vous devez le convertir comme ceci:

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

N'ajoutez pas manuellement la RSAbalise "manquante" " " à la main, car le format est différent.

rustyx
la source
-1

Les options de démarrage SSL doivent se trouver en haut de votre fichier my.cnf, sinon elles peuvent être ignorées. J'ai eu des problèmes lors de l'exécution de mysql 5.6 sur RHEL 6.4 où les variables SSL étaient ignorées, je les avais à la fin du fichier my.cnf. Je les ai déplacés en haut du fichier (juste en dessous de [mysqld]) puis j'ai redémarré le serveur et tout allait bien.

Christine
la source