Impossibile connettersi a mysql utilizzando il certificato SSL autofirmato


15

Dopo aver creato un certificato SSL autofirmato, ho configurato il mio server MySQL remoto per usarli (e SSL è abilitato)

Ho inserito il mio server remoto e provo a collegarmi al suo mysqld usando SSL (il server MySQL è 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, ricordo di aver letto un problema con la connessione allo stesso server tramite SSL. Quindi scarico le chiavi del client nella mia casella locale e provo da 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

Non è chiaro a cosa si riferisca questo errore "Errore di connessione SSL", ma se ometto -ssl-ca, sono in grado di connettermi utilizzando 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)

Tuttavia, credo che questo stia solo crittografando la connessione e non verificando effettivamente la validità del certificato (il che significa che sarei potenzialmente vulnerabile all'attacco man-in-middle)

I certificati SSL sono validi (sebbene autofirmati) e non hanno una passphrase su di essi. Quindi la mia domanda è: cosa sto facendo di sbagliato? Come posso connettermi tramite SSL, usando un certificato autofirmato?

La versione di MySQL Server è 5.5.25 e il server e i client sono CentOS 5.

Grazie per qualsiasi consiglio

Modifica : si noti che in tutti i casi, il comando viene emesso dalla stessa directory in cui risiedono le chiavi ssl (quindi nessun percorso assoluto)

Modifica (in risposta a mgorven): ca.certè il certificato dell'autorità di certificazione, che dovrebbe dire a mysql che la mia autorità di certificazione è attendibile.

La configurazione da my.cnfè

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

Ho anche provato ad aggiungere, ssl-cipher=DHE-RSA-AES256-SHAma da allora l'ho rimosso in quanto non ha aiutato.


2
Che cosa è ca.cert? È il certificato autofirmato del server? Stai utilizzando i certificati client per l'autenticazione? Fornire la configurazione relativa a SSL sul server.
mgorven,

Grazie, ho aggiornato la mia domanda con risposta e configurazione SSL dal server. I certificati passati sulla riga di comando quando si tenta di connettersi sono effettivamente certificati client.
carpii,

Infatti è una buona domanda. Con il senno di poi non sono sicuro che abbia senso specificare il server ssl-ca. Ma poi senza Im sotto l'impressione, la connessione crittografata non è rigorosamente autenticata
carpii,

Risposte:


12

Sì, hai ragione nel dire che se non lo specifichi, --ssl-cail client non controlla affatto il certificato del server. Poiché funziona senza tale opzione, il motivo più probabile dell'errore è che il client non si fida del certificato del server.

Se si utilizzano certificati client e server autofirmati, il ca.certfile deve includere entrambi questi file. In questo modo il client si fiderà del certificato del server e il server si fiderà del certificato del client.

Ad esempio:
generare la chiave del server e il certificato:

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

Generare la chiave client e il certificato:

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

Combina i certificati client e server nel file dei certificati CA:

$ cat server-cert.pem client-cert.pem > ca.pem

Grazie mille! Il passo mancante è che non stavo concatenando server e client in un ca.pem. Stavo invece passando il certificato ca. che è stato generato inizialmente (e poi passato come --CA-key durante la generazione di certificati client e server)
carpii,

Strano, ma ha sempre funzionato per me con un solo certificato CA - lo stesso su client e server.
Dmitry Leskov il

Sì, a condizione che non vi siano requisiti speciali per il DN, ad esempio il valore CN come valore specifico, è possibile utilizzare la stessa chiave e lo stesso certificato autofirmato sul client e sul server.
Keith Burdis,

3

Per usare un modo ssl, dovresti provare con:

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

Il client --ssl-certe --ssl-keysul client mysql sono utilizzati per SSL a 2 vie. Questo significa autenticazione basata su certificato. L'oggetto del certificato client dovrebbe essere il nome utente.


2
Inoltre, tenere presente che quando si effettua una connessione socket e si utilizza --ssl-verify-server-certil CN del certificato del server deve essere uguale all'host specificato per l'opzione della riga di comando -h.
Keith Burdis,

0

Per caso, non hai inserito lo stesso nome comune per i certificati server e client? In caso affermativo, sostituirne uno in modo che i nomi comuni siano diversi.


Per me, la soluzione di Dmitry Leskov ha funzionato. Secondo la documentazione SSL di MySQL: ( dev.mysql.com/doc/refman/5.0/en/creating-ssl-certs.html )> Qualunque metodo utilizzi per generare i file di certificati e chiavi, il valore Nome comune utilizzato per il server e i certificati / le chiavi client devono differire ciascuno dal valore Nome comune utilizzato per il certificato CA. In caso contrario, i file di certificati e chiavi non funzioneranno per i server compilati utilizzando OpenSSL. Un errore tipico in questo caso è: ERRORE 2026 (HY000): errore di connessione SSL: errore: 00000001: lib (0): func (0): reason (1)
gmas
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.