Home
  • Articoli
  • Transazioni sicure con MySQL grazie a OpenSSL
walter54
pubblicato circa un anno fa

Transazioni sicure con MySQL grazie a OpenSSL

Un interessante esperienza sulla configurazione SSL di MySQL per Windows

Gli scambi di dati che avvengono tra MySQL Server e i vari Clients possono essere intercettati e siccome viaggiano 'in chiaro', degli estranei potrebbero 'ficcare il naso' nelle nostre cose.
Un modo per impedire questo è la crittografazione delle transazioni.
Un programma Open Source che assolve questo compito è OpenSSL che utilizza la crittografia a chiave asincrona (pubblica/privata)
Per chi utilizza Windows, esiste una versione denominata Win32OpenSSL che, al momento in cui scrivo, è arrivata alla release 1.0.0c e si può scaricare da http://www.slproweb.com/products/Win32OpenSSL.html

Procedo ad elencare i passi necessari per impostare MySQL e OpenSSL. Il tutto è stato eseguito su SO WindowsXP e MySQL 5.5.9 oltre al predetto Win32OpenSSL 1.0.0c

  • Per prima cosa installare OpenSSL lanciando l'eseguibile Win32OpenSSL_Light-1.0.0c.exe
    Attenzione - Prima di eseguire l'installazione è necessario che sul computer sia presente Visual C++ 2008 Redistributables
    (release 2008 non precedenti e, a quanto pare, non successive)

    Siccome OpenSSL viene comandato da riga di comando, è necessario che venga inserito un opportuno riferimento in Windows, quindi
    da Start/Pannello di controllo/Sistema/Linguetta Avanzate/Variabili d'ambiente/Variabili di sistema scorrere fino a trovare la variabile Path
    selezionare Modifica e comparirà una finestra Modifica variabile di sistema, nella casella Valore variabile, andare alla fine dello scritto ed aggiungere
    l'indirizzo della cartella bin di OpenSSL vale a dire, per esempio,

    1C:\Programmi\OpenSSL-Win32\bin

    IMPORTANTE: prima dell'indirizzo bisogna inserire un ; per separare l'indirizzo in questione dagli altri preesistenti
    Se tutto questo è stato fatto correttamente, aprendo il terminale,
    i comandi di openssl si potranno eseguire da qualunque directory senza doversi posizionare in quella dove è installato OpenSSL.

  • Creare una directory dove inserire i certificati e le chiavi da creare (es. C:\MyOpenSSL-Data)
  • In questa cartella, aggiungerne altre due denominate C:\MyOpenSSL-Data\Certificati e ...SL-Data\Privato
    Nella prima cartella verranno inserite le richieste di certificati ed i certificati stessi, nella seconda le chiavi private.
  • Creare due files txt da inserire in C:\MyOpenSSL-Data e denominati Index.txt e serial
    Index.txt DEVE essere vuoto mentre serial (attenzione NON deve avere alcuna estensione) deve avere all'interno il numero 01
    Questi due files riportano alcuni dati dei certificati creati: index.txt i dati identificativi, serial il numero dei certificati creati
    I predetti files vengono aggiornati automaticamente da OpenSSL al momento della creazione dei certificati
  • A questo punto c'è ancora un passo da eseguire per essere pronti alla creazione delle chiavi/certificati. Impostare il file di configurazione di OpenSSL per specificare la directory dei dati.
    Posizionarsi nella cartella del programma in ...OpenSSL-Win32\bin ed aprire con un editor il file openssl.cfg (magari facendone prima una copia)
  • Scorrendo il file, nella sezione CA_default si trova la voce dir = ./demoCA sostituire ./demoCA con l'indirizzo della directory creata al punto 3.
    (es. dir = C:/MyOpenSSL-Data e occhio allo slash)
    Rettificare eventualmente le directories Certificate e Private in base a quelle create al punto 4
    Tutto il resto può essere lasciato così come è. Al massimo, successivamente, si potranno modificare altri parametri a proprio piacimento, una volta che si è ottenuta una maggior conoscenza e praticità al riguardo.
  • A questo punto si è pronti per la creazione delle chiavi/certificati, tuttavia vorrei analizzare un attimo - per quanto in mia conoscenza - il funzionamento della criptazione in chiave asincrona.
    Il sistema di criptazione è basato su di due chiavi una privata da non divulgare ed una pubblica da inviare a coloro con i quali si vuole effettuare lo scambio protetto dei dati.

    Es.
    A ha una chiave privata Aprv ed un certificato Acrt (chiave pubblica) A consegna a B il certificato Acrt, B invia i dati ad A crittografando gli stessi con Acrt e solo A tramite Aprv può decrittarli.
    Naturalmente lo stesso passaggio inverso viene fatto da A verso B, quindi A con chiave pubblica di B crittografa i dati e li invia a B che li legge con Bprv (chiave privata di B)
    Come detto in vari siti Internet, i punti deboli di tutto questo sono:
    - Le chiavi private vanno tenute sul computer, e qualcuno potrebbe rubarle
    - Una volta ricevuta una chiave pubblica da XY, non vi è l'assoluta certezza che sia stato proprio XY ad avermela inviata
    Poichè se un terzo estraneo, che in qualche modo si è intromesso, e mi ha inviato un suo certificato spacciandolo per certificato di B, tutti i dati potranno essere letti dall'estraneo con la sua chiave privata.
    Ed è per questo che vi sono le Autorità di Certificazione che firmano le chiavi garantendo la correttezza della loro origine e confermando l'abbinamento alla persona in oggetto.

    Nel nostro caso, trattandosi di dati che viaggiano in una intranet, possiamo effettuare la certificazione in proprio, ovvero sostituirci alla CA (autorità di certificazione)
    se invece dobbiamo uscire all'esterno bisognerà utilizzare delle chiavi certificate (e quindi...pagare) poichè la nostra certificazione sarebbe sconosciuta a tutti e quindi considerata inattendibile.

    Dopo questo preambolo passiamo quindi a creare la Chiave/Certificato della CA personale (detta anche di root) e successivamente i certificati/chievi del server e del client
    Navigando in Internet ho trovato diversi metodi per fare il tutto, alcuni funzionanti altri - pare - meno.
    Qua di seguito indico quello da me utilizzato e ritenuto valido, in quanto funzionante sul mio sistema.
    Aprire la finestra del terminale e posizionarsi sulla cartella creata C:\MyOpenSSL-Data e digitare i comandi seguenti:

    A - Chiave CA o di root
    > openssl genrsa -des3 -out My-CAkey.pem 4096 (generazione di una chiave RSA di 4096 bit)
    Verrà chiesta una passphrase perché con l'opzione -des3 abbiamo richiesto di criptare la chiave privata con l'algoritmo DES;
    Questa passphrase verrà richiesta ogni volta che OpenSSL deve utilizzare la chiave privata

    B - Certificato CA o di root
    > openssl req -new -x509 -days 0000 -nodes -key My-CAkey.pem -out My-CAcert.pem
    Verrà chiesta la passphrase della chiave privata e alcune informazioni standard presenti nei certificati
    l'opzione -days sta ad indicare il numero di giorni di validità della chiave.Sostituire gli zeri con la durata voluta.

    - Country name: : IT
    - State or Province (full name) : Italia
    - Locality name : Torino
    - Organization name : CA MyAutority
    - Organizational Unit : Admin
    - Common name : Pinco Pallino
    - Address email : pincopallino@hotmail.it

    Le risposte indicate qua sopra sono indicative e possono naturalmente
    essere modificate ma servono pe rla comprensione dei passi successivi.

    C - Chiave per il Server
    > openssl genrsa -out My-serverkey.pem 2048 (richiesta di una chiave RSA di 2048 bit)

    D - Certificato per il Server
    > openssl req -new -days 0000 -nodes -key My-serverkey.pem -out My-serverreq.pem (creazione di una CSR - richiesta di certificato)
    anche qua indicare il numero dei giorni di validità dopo -days

    • Country name: : IT
    • Locality name : Torino
    • Organizational Unit : SettoreSecurity
    • Address email : pincopallino@hotmail.it
    • State or Province (full name) : Italia
    • Organization name : CA MyAutority
    • Common name : Indicare il nome o l'indirizzo del computer Server

    Adesso siamo pronti, dalla richiesta di certificato ecco la firma vera e propria e l'emissione del certificato My-servercert.pem
    > openssl ca -day 3624/-enddate YYMMDDHHMMSSZ -keyfile My-CAkey.pem -cert My-CAcert.pem -in My-serverreq.pem -out My-servercert.pem
    Nel comando sopra indicato, ci sono due opzioni in alternativa: -days ed -enddate
    days indica i giorni di validità del certificato
    enddate indica la data di scadenza del certificato
    indicare naturalmente solo uno dei due, li ho proposti in quanto per comodità preferisco enddate
    Attenzione al formato della data YYMMDDHHMMSSZ ed alla Z finale (15/04/2011 ore 23:59:59 > 110415235959Z)

  • E - Chiave per il Client
    Per creare la chiave ed il certificato per il Client si eseguono gli stessi passi C e D sopra descritti con le seguenti accortezze:
    Cambiare il nome della chiave/richiesta cert/certificato (es. My-clientkey.pem)
     1Al momento della richiesta del certificato:
     2
     3- Country name:         : IT
     4- State or Province (full name)        : Italia
     5- Locality name         : Torino
     6- Organization name         : CA MyAutority
     7- Organizational Unit         : SettoreSecurity
     8- Common name         : Indicare un dato DIVERSO da quello indicato nel certificato Server (punto D)
     9- Address email         : pincopallino@hotmail.it

    Siamo quindi arrivati alla fine della creazione dei vari certificati e chiavi che si dovrebbero trovare nelle directory impostate all'inizio (punti 3 e 4)
    Non rimane quindi che effettuare i settaggi in MySQL e programmi di front-end per l'utilizzo del protocollo SSL

    MySQL
    Aprire il file my.ini, posizionarsi alla fine (e quindi nella sezione SERVER) ed aggiungere le seguenti voci (in relazione agli esempi):

     1#*** Impostazioni SSL SERVER ***
     2# Impostazioni da utilizzare nel file di configurazione my.ini del server
     3ssl = On
     4# Certificato CA
     5ssl-ca = "C:/MyOpenSSL-Data/Certificati/My-CAcert.pem"
     6# Certificato del Server
     7ssl-cert = "C:/MyOpenSSL-Data/Certificati/My-servercert.pem"
     8# Chiave del Server
     9ssl-key = "C:/MyOpenSSL-Data/Privato/My-serverkey.pem"
    10# Elenco dei sistemi di cifratura abilitati
    11ssl-cipher=ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:DES-CBC3-SHA
    12# Indirizzo dei certificati
    13ssl-capath = "C:/MyOpenSSL-Data/Certificati"

    Le ultime due voci ssl-cipher e ssl-capath ritengo possano essere superflue, la prima limita i sistemi di cifratura a quelli indicati la seconda è l'indirizzo del certificato CA

    Personalmente ho aggiunto anche le seguenti voci nella sezione CLIENT ma, vedo che funziona anche senza indicarle. Le riporto per completezza.

     1#*** Impostazioni SSL CLIENT ***
     2# Impostazioni da utilizzare nel file di configurazione my.ini del server
     3
     4# Certificato CA
     5ssl-ca = "C:/MyOpenSSL-Data/Certificati/My-CAcert.pem"
     6# Certificato del Server
     7ssl-cert = "C:/MyOpenSSL-Data/Certificati/My-clientcert.pem"
     8# Chiave del Server
     9ssl-key = "C:/MyOpenSSL-Data/Privato/My-clientkey.pem"
    10# Elenco dei sistemi di cifratura abilitati
    11ssl-cipher=ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:DES-CBC3-SHA
    12# Indirizzo dei certificati
    13ssl-capath = "C:/MyOpenSSL-Data/Certificati"

    Ora MySQL è pronto, bisogna però riavviare il tutto.

    Per tutti gli altri programmi, MySQL Workbench / ConnectorODBC / HeidySQL ecc... sarà sufficiente

    • copiare in una apposita directory del computer client, il certificato CA, il certificato client e la chiave client
    • indicare nelle tre voci ssl-ca/ssl-cert/ssl-key dei vari programmi che prevedono l'utilizzo di SSL l'indirizzo per il collegamento ai files suddetti

    e tutto dovrebbe funzionare egregiamente.

    P.S.
    Per chi volesse saperne un pò di più su SSL OpenSSL:

    http://www.dia.unisa.it/~ads/corso-security/www/CORSO-0001/OpenSSL/index.htm

    Allego 3 file batch per la creazione delle chiavi e dei certificati (verificare le directory di destinazione)

    ***** File1 *****

    1REM File di creazione dei Certificati e delle chiavi OpenSSL
    2C:
    3CHDIR C:\MyOpenSSL-Data
    4PAUSE Creazione della Chiave di CA - Premere un tasto
    5openssl genrsa -des3 -out C:\MyOpenSSL-Data\Privato\My-CAkey.pem 4096
    6
    7PAUSE Creazione del Certificato di CA - Premere un tasto
    8openssl req -new -x509 -days 3653 -nodes -key C:\MyOpenSSL-Data\Privato\My-CAkey.pem -out C:\MyOpenSSL-Data\Certificati\My-CAcert.pem

    ***** File2 *****

     1REM File di creazione dei Certificati e delle chiavi OpenSSL
     2C:
     3CHDIR C:\MyOpenSSL-Data
     4
     5PAUSE Creazione della Chiave server - Premere un tasto
     6openssl genrsa -out C:\MyOpenSSL-Data\Privato\My-serverkey.pem 2048
     7
     8PAUSE Creazione della richiesta del Certificato server - Premere un tasto
     9openssl req -new -days 3653 -nodes -key C:\MyOpenSSL-Data\Privato\My-serverkey.pem -out C:\MyOpenSSL-Data\Certificati\My-serverreq.pem
    10
    11PAUSE Creazione del Certificato server - Premere un tasto
    12openssl ca -enddate 201231235959Z -keyfile C:\MyOpenSSL-Data\Privato\My-CAkey.pem -cert C:\MyOpenSSL-Data\Certificati\My-CAcert.pem -in C:\MyOpenSSL-Data\Certificati\My-serverreq.pem -out C:\MyOpenSSL-Data\Certificati\My-servercert.pem

    ***** File3 *****

     1REM File di creazione dei Certificati e delle chiavi OpenSSL
     2C:
     3CHDIR C:\MyOpenSSL-Data
     4
     5PAUSE Creazione della Chiave client - Premere un tasto
     6openssl genrsa -out C:\MyOpenSSL-Data\Privato\My-clientkey.pem 2048
     7
     8PAUSE Creazione della richiesta del Certificato client - Premere un tasto
     9openssl req -new -days 3653 -nodes -key C:\MyOpenSSL-Data\Privato\My-clientkey.pem -out C:\MyOpenSSL-Data\Certificati\My-clientreq.pem
    10
    11PAUSE Creazione del Certificato client - Premere un tasto
    12openssl ca -enddate 201231235959Z -keyfile C:\MyOpenSSL-Data\Privato\My-CAkey.pem -cert C:\MyOpenSSL-Data\Certificati\My-CAcert.pem -in C:\MyOpenSSL-Data\Certificati\My-clientreq.pem -out C:\MyOpenSSL-Data\Certificati\My-clientcert.pem

Condividi su:

Esprimi un voto:

  • Current rating: 5.0/5
  • 1
  • 2
  • 3
  • 4
  • 5

Argomenti chiave:

Ultimi commenti Ultimi commenti

g2d
g2d
scrive: circa un anno fa

Era un bel pò di tempo che volevo provare mySQL e l'SSL Seguirò tutti i tuoi consigli .... Grazie per il tuo contributo

lucapette
lucapette
scrive: circa un anno fa

Argomento nuovo per me e anche per la community. Il tipo di aiuto che riteniamo prezioso! Grazie :)

re-verse
re-verse
scrive: circa un anno fa

Grazie Walter! :)

Esegui il Login oppure registrati per scrivere un commento.
Cerca nel sito...
Ultime recipes

Un utilissimo tool di shell che effettua un dettagliato e comodo report su MySQL MySQL Report un tool di shell per tenere tutto sotto controllo

Un utilissimo tool di shell che effettua un dettagliato e comodo report su MySQL


Vai alla recipe

Un utilissimo tool per sniffare il traffico Client/Server TCP/IP di MySQL MySQLSniffer sniffare il traffico TCP di MySQL

Un utilissimo tool per sniffare il traffico Client/Server TCP/IP di MySQL


Vai alla recipe

Verificare l'integrità, riparare gestire chiavi e memoria di tabelle MyISAM attraverso myisamchk riparare file MyISAM

Verificare l'integrità, riparare gestire chiavi e memoria di tabelle MyISAM attraverso il file myisamchk


Vai alla recipe

Un tool per comprimere le tabelle MyISAM fino a oltre il 50% myisampack comprimere file MyISAM

Un tool per comprimere le tabelle MyISAM fino a oltre il 50%


Vai alla recipe

mysqlshow le info di base sui database, tabelle e colonne senza utilizzare alcun mysqlshow visualizzare le informazioni sul database MySQL

mysqlshow le info di base sui database, tabelle e colonne senza utilizzare alcun client


Vai alla recipe

Utilizzando UNION / UNION ALL su campi int unsigned zerofill,
ho notato che MysqlUNION / UNION ALL su campi int unsigned zerofill. di DebUsr
Vai al tip

Utilizzo di funzioni come alias di campo tramite l'impiego di prepared statementReport con alias di campo dinamici di john_revelator
Vai al tip

Può capitare che sia necessario eseguire un dump di database in formato Comma SeparatedEsecuzione dump in formato CSV (tabelle in engine MyIsam esportate in formato CSV) di ghigomatto
Vai al tip

E' possibile eseguire le query SQL contenute in un file di testo. Questo è utileEseguire le query da un file di testo di Sante Caserio
Vai al tip

Se vogliamo fare il backup di tutti i database con mysqldump, e ne abbiamo parecchiFare il backup di tutti i database di Sante Caserio
Vai al tip

Salve,vorrei chiedervi un aiutino per una query che mi infastidisce un pò.
Ho 4 aiuto per una query! di fighterdorico Vai al topic

Salve,vorrei chiedervi un aiutino per una query che mi infastidisce un pò.
Ho 4 aiuto per una query! di fighterdorico Vai al topic

Salve,vorrei chiedervi un aiutino per una query che mi infastidisce un pò.
Ho 4 aiuto per una query! di fighterdorico Vai al topic

Salve a tutti.

Ho una tabella con lettere accentate.
Le lettere vengono visualizzate ordinamento tabelle di ditch Vai al topic

Salve a tutti.

Ho una tabella con lettere accentate.
Le lettere vengono visualizzate ordinamento tabelle di ditch Vai al topic