9 votes

MariaDB MySQL affiche have_ssl désactivé lors de l'installation des certs

J'essaie d'activer SSL sur mon serveur mariadb. J'ai suivi la documentation officielle de mariadb pour générer un ca-key ca-cert server-key server-cert. Ma machine est un vps debian 9 kvm avec mariadb 10.1.37

Quand je cours SHOW VARIABLES LIKE '%ssl'; en tant que root, j'obtiens ce résultat :

+---------------------+--------------------------------+
| Variable_name       | Value                          |
+---------------------+--------------------------------+
| have_openssl        | NO                             |
| have_ssl            | DISABLED                       |
| ssl_ca              | /etc/mysql/ssl/ca-cert.pem     |
| ssl_capath          |                                |
| ssl_cert            | /etc/mysql/ssl/server-cert.pem |
| ssl_cipher          |                                |
| ssl_crl             |                                |
| ssl_crlpath         |                                |
| ssl_key             | /etc/mysql/ssl/server-key.pem  |
| version_ssl_library | YaSSL 2.4.4                    |
+---------------------+--------------------------------+

J'ai essayé de recréer les certificats plusieurs fois, y compris avec des noms communs différents. Les certificats sont installés sous /etc/mysql/ssl/

J'ai également essayé de démarrer mysqld avec le --ssl et en ajoutant l'option ssl=on dans la configuration. Je ne trouve pas d'autres informations à ce sujet car j'ai YASSL au lieu d'openssl depuis que mariadb est maintenant compilé avec YASSL par défaut, à moins que j'oublie quelque chose, et que YASSL ne fonctionne pas avec mes clés ?

Comment j'ai créé les certificats et les clés :

openssl genrsa 2048 > ca-key.pem

openssl req -new -x509 -nodes -days 365000 \
      -key ca-key.pem -out ca-cert.pem

openssl req -newkey rsa:2048 -days 365000 \
      -nodes -keyout server-key.pem -out server-req.pem

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

openssl x509 -req -in server-req.pem -days 365000 \
      -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 \
      -out server-cert.pem

Mon fichier 50-server.cnf :

    #
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Basic Settings
#
user        = mysql
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
port        = 3306
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address        = 0.0.0.0

#
# * Fine Tuning
#
key_buffer_size     = 16M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam_recover_options  = BACKUP
#max_connections        = 100
#table_cache            = 64
#thread_concurrency     = 10

#
# * Query Cache Configuration
#
query_cache_limit   = 1M
query_cache_size        = 16M

#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file        = /var/log/mysql/mysql.log
#general_log             = 1
#
# Error log - should be very few entries.
#
log_error = /var/log/mysql/error.log
#
# Enable the slow query log to see queries with especially long duration
#slow_query_log_file    = /var/log/mysql/mariadb-slow.log
#long_query_time = 10
#log_slow_rate_limit    = 1000
#log_slow_verbosity = query_plan
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id      = 1
#log_bin            = /var/log/mysql/mysql-bin.log
expire_logs_days    = 10
max_binlog_size   = 100M
#binlog_do_db       = include_database_name
#binlog_ignore_db   = exclude_database_name

#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!

#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates you can use for example the GUI tool "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
#
ssl-ca = /etc/mysql/ssl/ca-cert.pem
ssl-key = /etc/mysql/ssl/server-key.pem
ssl-cert = /etc/mysql/ssl/server-cert.pem
#
# Accept only connections using the latest and most secure TLS protocol version.
# ..when MariaDB is compiled with OpenSSL:
#ssl-cipher=TLSv1.2
# ..when MariaDB is compiled with YaSSL (default in Debian):
ssl=on

#
# * Character sets
#
# MySQL/MariaDB default is Latin1, but in Debian we rather default to the full
# utf8 4-byte character set. See also client.cnf
#
character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci

#
# * Unix socket authentication plugin is built-in since 10.0.22-6
#
# Needed so the root database user can authenticate without a password but
# only when running as the unix root user.
#
# Also available for other users if required.
# See https://mariadb.com/kb/en/unix_socket-authentication-plugin/

# this is only for embedded server
[embedded]

# This group is only read by MariaDB servers, not by MySQL.
# If you use the same .cnf file for MySQL and MariaDB,
# you can put MariaDB-only options here
[mariadb]

# This group is only read by MariaDB-10.1 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand
[mariadb-10.1]

15voto

Reece Points 141

Après quelques heures de bricolage, j'ai compris que mysql n'arrivait pas à lire le fichier clé. J'ai mis le groupe des fichiers à mysql.

chown -R mysql:mysql /etc/mysql/ssl/

2voto

mako Points 11

J'ai obtenu le même comportement sur la famille RedHat.

Il s'avère que SELinux a bloqué le have_ssl parce que les certificats ne sont pas dans le home de mysql/mariadb.

Il suffit de déplacer les fichiers dans le répertoire de l'utilisateur mysql, que vous pouvez trouver à l'aide de la commande suivante :

grep mysql /etc/passwd | awk -F ':' '{ print $6}'

0voto

J'ai eu un problème différent. J'ai utilisé OpenSSL pour générer ma clé et il a créé un fichier PKCS#8 qui ressemble à ceci :

-----BEGIN PRIVATE KEY-----
[base64 key material]
-----END PRIVATE KEY-----

Il semble que le serveur attende un fichier PKCS#1, qui ressemble à ceci :

-----BEGIN RSA PRIVATE KEY-----
[base64 key material]
----END RSA PRIVATE KEY-----

Pour passer d'une forme à l'autre, vous pouvez utiliser openssl :

$ openssl rsa -in /path/to/pkcs8 > /path/to/pkcs1

Une fois que j'ai fait cela, j'ai pu démarrer mon serveur avec SSL activé.

Les versions les plus récentes d'OpenSSL utilisent par défaut les fichiers PKCS#8, tandis que les versions plus anciennes utilisaient par défaut les fichiers PKCS#1 (pour les clés RSA). Cela expliquerait pourquoi des guides écrits (et fonctionnant !) il y a plusieurs années peuvent poser des problèmes aujourd'hui.

MariaDB doit vraiment prendre en charge les fichiers de clés PKCS#8. Je suis sûr que ce ne serait pas un problème si mon MariaDB avait été construit avec OpenSSL, mais il utilise YaSSL comme l'affiche originale.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X