Abilitazione SSL in MySQL


24

Sto eseguendo Ubuntu Server 12.04 e voglio abilitare le connessioni SSL a MySQL.

Ho generato i seguenti file keys / certs con OpenSSL:

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

Li ho archiviati in /etc/mysql, quindi ho aggiunto le seguenti righe a /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

Successivamente, ho riavviato il server con sudo service restart mysql.

Tuttavia, questo non sembra abilitare SSL. All'interno di una sessione 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  |
+---------------+----------------------------+

Qualche idea su cosa mi sto perdendo? Grazie


2
Dai un'occhiata a questo fantastico thread .. Forse potrebbe aiutarti.
SirCharlo,

Grazie per il link SirCharlo, ma il problema risolto in quel thread non sembra applicarsi alla mia situazione.
visitatore93746

1
Quello che @SirCharlo menziona è dove vuoi guardare. In particolare la parte Apparmor e post # 10 . Le chiavi che ho generato su Debian Squeeze o su un vecchio Ubuntu funzionano bene - la rigenerazione in 12.04 fa fallire di nuovo. Vedi anche i log degli errori di MySQL.
gertvdijk,

2
Ho avuto la stessa domanda e ci ho passato ore, ma la risposta di @ user262116 l'ha risolta. Ti incoraggio ad accettare quella risposta se ti aiutasse!
elixenide,

Risposte:


33

Ubuntu 12.04 viene fornito con OpenSSL 1.0.1, che presenta impostazioni predefinite leggermente diverse rispetto alla precedente versione OpenSSL 0.9.8.

Tra le altre cose, se stai usando openssl req -newkey rsa:2048per generare una chiave RSA, finirai con una chiave in un formato chiamato PKCS # 8 . Rappresentate nel formato PEM, queste chiavi hanno l' -----BEGIN PRIVATE KEY-----intestazione più generica , che non ti dice che tipo di chiave (RSA, DSA, EC) è.

In precedenza, con OpenSSL 0.9.8, le chiavi erano sempre in un formato chiamato PKCS # 1 , che rappresentava PEM, aveva l'intestazione -----BEGIN RSA PRIVATE KEY-----.

Per questo motivo non puoi semplicemente modificare l'intestazione e il piè di pagina da:

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

a

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

Non è la stessa cosa e non funzionerà. Invece è necessario convertire la chiave nel vecchio formato utilizzando openssl rsa. Come questo:

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

MySQL (v5.5.35) su Ubuntu 12.04 utilizza un'implementazione SSL denominata yaSSL (v2.2.2). Prevede che le chiavi siano nel formato PKCS # 1 e non supportano il formato PKCS # 8 utilizzato da OpenSSL 1.0 e versioni successive. Se cambi semplicemente intestazione e piè di pagina, come suggerito da altri post in questo thread, MySQL / yaSSL non si lamenterà, ma non sarai in grado di connetterti e finirai con un errore come questo:

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

Ubuntu 14.04 viene fornito con OpenSSL 1.0.1f e nuove impostazioni. Tra le altre cose, genererà certificati con digest SHA256 anziché SHA1, utilizzato nelle versioni precedenti. Per inciso, la versione yaSSL in bundle con MySQL non supporta neanche questo.

Se stai generando certificati da utilizzare con MySQL, ricorda di assicurarti che le chiavi RSA siano convertite nel tradizionale formato PEM PKCS # 1 e che i certificati utilizzino digest SHA1.

Ecco un esempio di come generare la propria CA, un certificato server e un certificato 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

1
Questo post mi ha salvato la giornata! Spiegazione e soluzione fantastiche.
generalopinion,

Ho ricevuto "ERRORE 2026 (HY000): errore di connessione SSL: ASN: prima della data futura"
Nitsan Baleli,

Sfortunatamente, ho ancora ricevuto gli ERROR 2026 (HY000): SSL connection error: protocol version mismatcherrori (usando OpenSSL 1.0.1f). Sono passato a OpenSSL 1.0.1e e ha funzionato con le istruzioni sopra.
Jarrett,

2
Questa risposta è sorprendente: assegnerei una generosa ricompensa se potessi. Ottima spiegazione del problema.
elixenide,

Un'altra voce da aggiungere all'orda. Ho esplorato Internet cercando di trovare una soluzione al motivo per cui la configurazione documentata di MySQL non avrebbe funzionato: la parte inferiore di questo post mi ha completamente salvato la giornata.
Steve Chambers,

4

Questo mi ha aiutato:

L'intestazione e il piè di pagina del file server-key.pem sembravano così:

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

Ma richiede qualcosa del genere:

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

Nota il TASTO PRIVATO DI INIZIO RSA

Per vedere il registro:

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

Spero che sia di aiuto.


Ho avuto un problema simile nel mio Ubunbtu 12.04 con mysql 5.5.34, dove tutti i file pem erano leggibili da tutti e mi davano lo stesso problema. Ma questa risposta combinata con il cambiamento del proprietario ha fatto il trucco.
Tommy Andersen,

Non aggiungere manualmente "RSA" - questo eliminerà solo l'errore, ma SSL non funzionerà (otterrai un altro errore, " Errore di connessione SSL: mancata corrispondenza della versione del protocollo "). Converti invece dal formato PKCS # 8 al formato PKCS # 1 utilizzandoopenssl rsa
rustyx il

3

Ho avuto gli stessi problemi su 12.04 ma in realtà è stato apparmor a causare i problemi.

Ho trovato una soluzione nei forum di Ubuntu , spostando i .pemfile nel /etc/mysqlrisolto.

Puoi anche cambiare la configurazione di apparmor in /etc/apparmor.d/usr.sbin.mysqld.


Questo è stato anche il problema che ho avuto
Jonathan,

è un errore di battitura? vuoi dire "spostare i file pem in" invece di "spostare i file pem in"? scusate se sono così pedante ma mi sono un po 'confuso
knocte

1

Assicurarsi che l'utente che esegue il processo mysqld abbia accesso in lettura alle chiavi e ai file dei certificati. Se avvii MySQL usando l'account "mysql", dovresti:

/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

Altrimenti, è possibile che nel registro degli errori venga visualizzato quanto segue:

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

Grande. Ma come si può fare? Prenditi un po 'di tempo e spiega ulteriormente, dando maggiori informazioni :)
Lucio,

Questo combinato con l'aggiunta di RSA al file server-key.pem ha funzionato.
Tommy Andersen,

1

Su Ubuntu 16.04, ho corso mysql_ssl_rsa_setup, potrebbe vedere i file in variabili mostrano come nella domanda, ma have_ssle have_opensslcontinuato ad essere DISABLED.

La soluzione era chown mysql.mysql /var/lib/mysql/*.pem. In alternativa, suppongo che se esegui mysql_ssl_rsa_setup come utente mysql, creerà i file con le autorizzazioni corrette.


La domanda ha quattro anni e due mesi ... È improbabile che l'OP risponderà alla tua risposta.
WinEunuuchs2Unix il

1
Ho pubblicato questo semplicemente come un servizio per i futuri lettori perché questo è uno dei migliori risultati di ricerca di Google per questo problema e nulla di ciò che ho letto ha aiutato a risolvere il mio problema. Il valore di questa risposta in riferimento allo stato del mondo in Ubuntu 12.04 e persino 14.04 sta perdendo rilevanza.
Craig Wright,

@ WinEunuuchs2Unix Forse non l'OP, ma eccomi qui, quasi due anni dopo, cercando esattamente questa risposta. Quindi, grazie Craig!
Oldskool,

0

Il file della chiave privata dovrebbe apparire come (formato PKCS # 1):

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

Se la tua chiave privata inizia invece con:

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

(Formato PKCS # 8), quindi dovresti convertirlo in questo modo:

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

Non aggiungere manualmente il RSAtag "mancante" " " perché il formato è diverso.


-1

Le opzioni di avvio SSL dovrebbero trovarsi nella parte superiore del file my.cnf o potrebbero essere ignorate. Ho avuto problemi con MySQL 5.6 su RHEL 6.4 in cui le variabili SSL venivano ignorate, le avevo alla fine del file my.cnf. Li ho spostati nella parte superiore del file (appena sotto [mysqld]), quindi ho riavviato il server e tutto è andato bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.