# [MySQL] SSL connection

## bennyzzz

Salut à tous, 

J'ai un petit problème pour faire fonctionner mysql en utilisant SSL. N'ayant pas réussi à le faire fonctionner sur Gentoo, et ce sur différents systèmes... j'ai tenté sur une autre distribution (mint pour ne citer personne) et avec la même configuration mysql et les mêmes certificats cela fonctionne. 

J'ai pas mal googlé mais j'ai rien trouvé concernant Gentoo, SSL et MySQL donc j'ai ouvert un bug. Malgré tout si quelqu'un à réussi à faire le setup et peut m'aider, je suis plus que preneur.

Merci d'avance.

----------

## bennyzzz

Personne n'a jamais eu de problème, ou personne n'a jamais essayé   :Rolling Eyes: 

Si vous avez 20 minutes à perdre, je vous serais très reconnaissant d'essayer et de me dire ici-même ou dans le bug ouvert si vous avez le même problème ou pas ?

Merci d'avance !

----------

## boozo

'alute

Edit : Ayé!   :Embarassed:  

Suis pas expert en mysql mais ça roule chez moi en local (client+serveur) avec mysql-5.1.67 + openssl-1.0.1c.

[Bon soit, j'enjolive un brin les choses : j'y ai passé plus de 20mins du fait des multiples tests et recherches   :Laughing:  ]

=> Alors le problème doit se situer pour toi lors de la génération des certificats.

Il y a un bug upstream qui traine depuis quelques mois à ce sujet et (autre ref complémentaire) je peux confirmer que le workaround marche dans mes différents tests car si je procède de même (process ci-après) en mettant les mêmes valeurs de références partout, je retombe bien sur le même echec de connexion que toi.

Voilà c'est pas garanti sur facture mais il est très probable qu'il en soit de même chez toi   :Wink: 

ps: Au fait, bienvenue sur gentoo et le forum FR ^^

En synthèse ci-après si besoin de tester : 

D'après ce que tu indiques dans ton rapport, le côté serveur semble ok et je fait le présupposé que tu disposes bien d'un user (non root) qui a les droits nécessaires en connection ssl i.e. chez moi

```
mysql> show grants for 'bozossl'@'localhost';

+-------------------------------------------------------------------------------------------------------------------------------------+

| Grants for bozossl@localhost                                                                                                        |

+-------------------------------------------------------------------------------------------------------------------------------------+

| GRANT ALL PRIVILEGES ON *.* TO 'bozossl'@'localhost' IDENTIFIED BY PASSWORD '*E45429EA6A0BD15BE30021ED1B4985D6CBAE4FF0' REQUIRE SSL |

+-------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

```

Ensuite générer les certificats selon la procédure standard que tu utilises également (je te t'indiques mes valeurs de test)

```
#openssl genrsa 2048 > ca-key.pem
```

```
#openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca-cert.pem

(...)

Country Name (2 letter code) [AU]:FR

State or Province Name (full name) [Some-State]:Eutopia

Locality Name (eg, city) []:Liberty

Organization Name (eg, company) [Internet Widgits Pty Ltd]:Fy

Organizational Unit Name (eg, section) []:Fy1

Common Name (e.g. server FQDN or YOUR name) []:Fy01          

Email Address []:
```

```
#openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem

(...)

-----

Country Name (2 letter code) [AU]:FR

State or Province Name (full name) [Some-State]:Eutopia

Locality Name (eg, city) []:Liberty

Organization Name (eg, company) [Internet Widgits Pty Ltd]:Fy

Organizational Unit Name (eg, section) []:Fy2

Common Name (e.g. server FQDN or YOUR name) []:Fy02

Email Address []:

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:erty

An optional company name []:Fy002

```

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

writing RSA key
```

```
#openssl x509 -req -in server-req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

Signature ok

subject=/C=FR/ST=Eutopia/L=Liberty/O=Fy/OU=Fy2/CN=Fy02

Getting CA Private Key
```

```
#openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem

(...)

-----

Country Name (2 letter code) [AU]:FR

State or Province Name (full name) [Some-State]:Eutopia

Locality Name (eg, city) []:Liberty1

Organization Name (eg, company) [Internet Widgits Pty Ltd]:Funny

Organizational Unit Name (eg, section) []:Funnylib1         

Common Name (e.g. server FQDN or YOUR name) []:Fylib1

Email Address []:

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:ertyu

An optional company name []:Fylib01
```

```
#openssl rsa -in client-key.pem -out client-key.pem

writing RSA key
```

```
#openssl x509 -req -in client-req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

Signature ok

subject=/C=FR/ST=Eutopia/L=Liberty1/O=Funny/OU=Funnylib1/CN=Fylib1

Getting CA Private Key
```

```
#openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem

server-cert.pem: OK

client-cert.pem: OK
```

```
#mysql -ubozossl -hlocalhost -p

Enter password: 

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.1.67-log Gentoo Linux mysql-5.1.67

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show variables like '%ssl%';

+---------------+----------------------------------+

| Variable_name | Value                            |

+---------------+----------------------------------+

| have_openssl  | YES                              |

| have_ssl      | YES                              |

| ssl_ca        | /etc/mysql/certs/ca-cert.pem     |

| ssl_capath    |                                  |

| ssl_cert      | /etc/mysql/certs/server-cert.pem |

| ssl_cipher    |                                  |

| ssl_key       | /etc/mysql/certs/server-key.pem  |

+---------------+----------------------------------+

7 rows in set (0.01 sec)
```

----------

## bennyzzz

Merci beaucoup d'avoir pris le temps de tester et de ton feedback... et aussi pour ton message de bienvenu, si petit soit-il   :Razz: 

Je n'arrive pas du tout à avoir un truc qui fonctionne, donc je pense que je dois pas faire quelque chose ... mais quoi    :Exclamation:   :Question: 

Par contre quand je vérifie mes certificats, j'ai l'output suivante, est-ce que tu penses que cela puisse-être la cause du problème?

```
openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem                                                    

server-cert.pem: C = AU, ST = Some-State, O = Internet Widgits Pty Ltd

error 18 at 0 depth lookup:self signed certificate

OK

client-cert.pem: C = AU, ST = Some-State, O = Internet Widgits Pty Ltd

error 18 at 0 depth lookup:self signed certificate

OK

```

Merci d'avance!

----------

## boozo

Oui je le crains. Au départ, je pensais que le traditionnel warning lié au certificat autosigné était juste là à titre indicatif mais en essayant avec des valeurs non nulles j'obtiens bien une signature conforme sans warning.

Après, je n'ai pas fait un test très rigoureux pour identifier de façon formelle le champ ; j'ai juste voulu éviter un effet de bord en lien avec les blankchars en renseignant "correctement" les items.

Et c'est en spécifiant un CN client différent de celui du serveur comme le mentionne le workaround du bug que je t'ai signalé que je peux passer la connexion en ssl pour le user.

Btw, le message de bienvenu j'aurai pu le faire plus gros c'est vrai mais ça n'en modifie pas la teneur  ^^ c'est suite a mes loupés de posts/edits malencontreux que j'y ai pensé.

Edit: Je n'avais pas trop de temps de contrôler tout à l'heure donc je complète :

Je ne sais pas ce qu'il en est sous Mint vu que cela fonctionne avec ton certificat actuel peut-être une différence de version de packages ? de config ? ce n'est pas toujours évident de comparer tel quel.

Quoi qu'il en soit si le besoin est sous gentoo, la politique par défaut si tu n'as rien modifié en conf ou en argument c'est "policy_match" et donc il semble bien qu'un CN doit être précisé en plus des 3 premiers items :

```
# For the CA policy

[ policy_match ]

countryName      = match

stateOrProvinceName   = match

organizationName   = match

organizationalUnitName   = optional

commonName      = supplied

emailAddress      = optional

```

----------

## bennyzzz

 *boozo wrote:*   

> 
> 
> ```
> #mysql -ubozossl -hlocalhost -p
> 
> ...

 

Re, 

est-ce que tu peux me dire si tu essaies simplement comme ci-dessus ? Pour ma part ça foire même avant, avec la commande suivante:

```
mysql -ubozossl --ssl-ca=/etc/mysql/certs/ca-cert.pem -p 
```

Or cette commande est censée fonctionner sur la machine local... 

Cela implique donc que le certificat du client n'est même pas encore utilisé, et donc que le CN comme tu indiques très justement n'est même pas encore impliqué... 

Est-ce que tu peux stp me coller les parties "mysqld" et "client" de ton my.cnf ? Je pense pas que le problème vienne de là mais comme tu t'es porté volontaire pour me filer un coup de main autant que j'en profite  :Wink: 

----------

## boozo

Oui bien sûr que les 2 cas de figures fonctionnent - quoi que forcer la conf n'est pas utile vu le paramétrage -

```
$ mysql -ubozossl --ssl-ca=/etc/mysql/certs/ca-cert.pem -p

Enter password: 

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.1.67-log Gentoo Linux mysql-5.1.67

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> \s

--------------

mysql  Ver 14.14 Distrib 5.1.67, for pc-linux-gnu (i686) using readline 5.1

Connection id:      1

Current database:   

Current user:      bozossl@localhost

SSL:         Cipher in use is DHE-RSA-AES256-SHA

Current pager:      /usr/bin/less

Using outfile:      ''

Using delimiter:   ;

Server version:      5.1.67-log Gentoo Linux mysql-5.1.67

Protocol version:   10

Connection:      Localhost via UNIX socket

Server characterset:   utf8

Db     characterset:   utf8

Client characterset:   utf8

Conn.  characterset:   utf8

UNIX socket:      /var/run/mysqld/mysqld.sock

Uptime:         37 sec

Threads: 1  Questions: 4  Slow queries: 0  Opens: 15  Flush tables: 1  Open tables: 8  Queries per second avg: 0.108

--------------

mysql> 
```

Donc c'est peut-être ton paramétrage en effet - si besoin donc le service en cours d'utilisation :

```
mysql    12463  0.3  2.4  82320 25440 ?        Ssl  19:33   0:00 /usr/sbin/mysqld --defaults-file=/etc/mysql/my.cnf --ssl --skip-networking

```

 *je te mets les qq extraits pertinents du my.cnf wrote:*   

> 
> 
> ```
> 
> (...)
> ...

 

----------

## bennyzzz

Ah je dois en effet un problème au vu du process qui tourne :

```
mysql    25809     1  0 18:41 ?        00:00:00 /usr/sbin/mysqld --defaults-file=/etc/mysql/my.cnf
```

En revanche ma configuration est comme je le pensais exacte (  :Crying or Very sad:  )

Et même quand je lance mysqld à la main avec les mêmes paramètres que ce que tu as, le ssl ne passe pas alors je me demande 2 choses:

1) Quel est le trigger pour les paramètres de démarrage de mysql, est-ce le USE flag ou est-ce la conf ? 

2) J'ai du foiré un truc quelque part au moment de l'installation pour que avec tes options cela ne fonctionne pas mieux...

Voici mon package.use:

```
dev-db/mysql ssl extraengine
```

Et j'ai juste emerger dev-db/mysql ... 

Je loupe quelque chose ?

----------

## boozo

Ah ben oui là... c'est bien d'avoir compilé le support ssl pour mysql mais encore faut-il lancer le démon avec   :Wink: 

Renseigne au moins $MY_ARGS="--ssl" dans /etc/conf.d/mysql et relance le service voir si c'est mieux

----------

## bennyzzz

Comme tu dis ....  :Rolling Eyes:   :Embarassed: 

Mais bon même avec c'est toujours le même problème ... 

```
mysql    32617     1  0 19:54 ?        00:00:00 /usr/sbin/mysqld --defaults-file=/etc/mysql/my.cnf --ssl --skip-networking
```

Et ce que me "chagrine" c'est que j'ai tenté cette installation sur plusieurs systèmes gentoo (sur une image du bureau, sur une machine ovh, et sur un container openvz) et je n'ai toujours pas réussi à en faire fonctionner 1.... et j'arrive pas à avoir de log et ça qu'est ce que ça me frustre   :Twisted Evil: 

----------

## bennyzzz

Au fait tu as quoi comme USE flags ?

----------

## boozo

Ah ?! étrange    :Sad: 

Mais je lis ovh et je viens de prendre 20pts de tension alors rassure-moi :

c'est _bien_ une gentoo native qui est dessus ?

Sinon je sais que tu l'as déjà envisagé mais un pb de droits sur le(s) répertoire(s) des certificats sinon du user mysql ? (c'est une différence que j'ai avec ta conf me semble-t-il)

Juste pour voir si c'est lié (bien que j'en doute un peu m'enfin sait-on jamais) et si ce n'est déjà fait : créé-toi un user mysql spécifique, colle-lui les droits/pwd qui vont bien ainsi qu'un /etc/mysql/certs et refait dedans la procédure que je t'ai donné dans mon premier post pour générer tes cerificats - ce n'est pas que je doute mais c'est simplement pour s'affranchir d'un pb de séquence de travail par la même occasion ; des fois ça arrive de zapper une étape à force de re-re-refaire les choses   :Wink: 

Edit: USE standard => community extraengine ssl

----------

## bennyzzz

Euhhh je sais plus, c'est la gentoo que eux fournissent...

Et sinon je comprends pas bien pourquoi tu me dis que on a une différence au niveau de la conf, je ne vois pas ou ?

Sinon j'ai essayé de refaire les certificats avec le user mysql mais j'ai une erreur ...

```
mysql@mysqlssl ~ $ openssl genrsa 2048 > ca-key.pem

warning, not much extra random data, consider using the -rand option

Generating RSA private key, 2048 bit long modulus

139868203058856:error:24064064:random number generator:SSLEAY_RAND_BYTES:PRNG not seeded:md_rand.c:522:You need to read the OpenSSL FAQ, http://www.openssl.org/support/faq.html

139868203058856:error:04081003:rsa routines:RSA_BUILTIN_KEYGEN:BN lib:rsa_gen.c:208:

```

Je vais essayer de comprendre pourquoi j'ai cette erreur et je tente de refaire les certificats... mais je pense que ce sera pour demain  :Wink: 

Merci de ton aide, je te tiens au courant demain.

----------

## boozo

Aïe...(20pts de plus au tensiomètre) : "la gentoo que eux fournissent" càd leur "Release 2" ?   :Twisted Evil: 

Je parle de la différence de stockage des certificats /var/lib chez toi non ? et je crois que tu testais en root aussi ?

~off: heuu vu le prompt et le message d'erreur : tu testes loggé en user "mysql" qui gère le démon là (rapport aux droits spécifiques qui sont peut-être incompatibles) ?

(plus haut, je parlais juste de prendre un user lambda client de la base au départ)

Je déconne mais si en plus on prend un user "Root" pour tester je vais avoir mal au crâne... :p (root (real) / root "mysql" / user "Root" / ...)

----------

## boozo

Je reposte car je viens de penser à autre chose qui pourrai jouer vu que tu utilises des conteneurs et autres :

est-ce que pour ton dernier essai tu ne serais pas dans un chroot ?

D'après la faq openssl et les droits sur /dev/urandom il ne devrait pas y avoir de pb sauf si tu es dans un chroot et que /dev/urandom est "vide" i.e. - d'où pas assez de données randomisées causant l'échec de création du certificat.

----------

## bennyzzz

Je peux pas te répondre pour la gentoo chez OVH parce que je n'ai plus cette machine mais jepense que tu as raison, c'est leur release..

Par contre je viens de tester avec un autre user et j'ai toujours le même problème ... je ne comprends vraiment pas pourquoi je n'arrive pas à avoir cette putain de connection ssl sur aucune de mes box gentoo ... et que toi tu y arrives tout de suite ....  :Rolling Eyes: 

----------

## boozo

Il doit bien avoir un râté qqpart et en refaisant la séquence point par point au calme tu vas trouver  :Wink:  c'est souvent une chose qui creve les yeux et qu'on oublie de faire/vérifier/recontrôler parce qu'on est certain de son coup - c'est pourquoi je t'ai mis ma séquence de travail en espérant que tu vois plus facilement ce qui cloche.

Sinon je t'ai indiqué quelques points de vérifications (pathways notamment) le restultat est-il identique ?

(et qu'en est-il de l'echec de génération du certificat ?)

btw, pour ovh alors on oubli le cas avec joie - sutrout si c'est comme pour leur apache et php -   :Laughing: 

----------

## bennyzzz

Merci beaucoup, en effet je pense que c'est une mauvaise manip, je vais refaire ça au calme comme tu dis !!! 

Par contre juste pour être sur j'ai changé de /var/lib à /etc/mysql/

Je te tiens au courant, mais ce sera sûrement que demain parce que j'ai d'autre chat à fouetter   :Rolling Eyes: 

----------

