Clark's Home page

Tecnicismi vari di un Sysadmin Linux ma anche qualcosa della sua vita

SSL generazione di certificati per uso proprio —

Poiché sono ferocemente avverso al  traffico web in chiaro,  ho fatto in modo che il CRM aziendale  lavorasse in https al posto che in http.
Il discorso è abbastanza semplice per come la vedo io e lo ripeterò sino alla nausea in queste pagine, la sicurezza assoluta non esiste, ma il rendere la vita dannatamente dura a chi non ha nulla di meglio da fare nella vita si può e secondo me si deve.
Noi sostanzialmente non siamo un industria High Tech che vale davvero la pena di sfondare, quindi la gente “seria” non ci calcola neanche, restano tutti gli altri di mezza tacca a cui se rendi la vita difficile dopo un po mollano il colpo e provano altrove.
L’applicativo in questione non richiede onestamente la spesa di un certificato firmato digitalmente da un’autority, quindi ho deciso che l’autority sono IO!
Tutte le operazioni vanno eseguite come root, una volta installato openssl ho creato una directory sotto /etc/ssl/ col nome della mia ditta, e una volta posizionato li ho creato la chiave principale con

openssl genrsa -des3 -out myfirm-CA.key 4096
Generating RSA private key, 4096 bit long modulus
………………………………………………………………………….++
………………………………………..++
e is 65537 (0x10001)
Enter pass phrase for myfirm-CA.key:
Verifying – Enter pass phrase for myfirm-CA.key:
e ho messo unabellapasswordlungaecomplicata

È  adesso il momento di generare il  certificato

openssl req -new -key myfirm-CA.key -x509 -days 3650 -out myfirm-CA.crt

Il comando req serve a creare una richiesta di certificato  o a generare un certificato autofirmato come nel nostro caso.
Con -new specifichiamo che si tratta di una nuova richiesta in modo da poter inserire tutti i dati relativi al certificato.
L’opzione -key indica la chiave privata usata per firmare il certificato, -x509 il formato del certificato, -days la validità in giorni del certificato in questo caso 10 anni, -out il nome del file generato per contenere il certificato.

Enter pass phrase for myfirm-CA.key:unabellapasswordlungaecomplicata

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter ‘.’, the field will be left blank.

—–

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

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

Locality Name (eg, city) []:Milano

Organization Name (eg, company) [Internet Widgits Pty Ltd]:myfirm S.p.A.

Organizational Unit Name (eg, section) []:Certification Autority

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

Email Address []:root@myfirm.com

e con questo ho finito di essere autority e torno SysAdmin.

Si tratta adesso di generare la chiave privata per il server la procedura è sostanzialmente la stessa di prima cambia la lunghezza della chiave

openssl genrsa -des3 -out crm.myfirm.com.key 2048
Generating RSA private key, 2048 bit long modulus
……………………………………………………………..+++
…………………………………………………………………………….+++
e is 65537 (0x10001)
Enter pass phrase for crm.myfirm.com.key:trovalaseseicapace
Verifying – Enter pass phrase for crm.myfirm.com.key:trovalaseseicapace

e  la chiave è’ a posto

Procedo con la richiesta di certificato che sarà emesso dalla mia autority , la procedura è sostanzialmente la stessa ma N.B. il Common Name DEVE corrispondere all’indirizzo  usato per la connessione SSL in questo caso crm.myfirm.com

root@crm:/etc/ssl/myfirm# openssl req -new -key crm.myfirm.com.key -out crm.myfirm.com.csr
Enter pass phrase for crm.myfirm.com.key:trovalaseseicapace
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [AU]:IT
State or Province Name (full name) [Some-State]:Italy
Locality Name (eg, city) []:Inveruno
Organization Name (eg, company) [Internet Widgits Pty Ltd]:myfirm S.p.A.
Organizational Unit Name (eg, section) []:Servizi Web
Common Name (e.g. server FQDN or YOUR name) []:crm.myfirm.com
Email Address []:root@myfirm.com

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Rimetto il cappello da autority e  genero il certificato in formato x509  per il sito firmato con la chiave privata della CA

root@crm:/etc/ssl/myfirm# openssl x509 -req -in crm.myfirm.com.csr -out crm.myfirm.com.crt -sha1 -CA myfirm-CA.crt -CAkey myfirm-CA.key -CAcreateserial -days 3650
Signature ok
subject=/C=IT/ST=Italy/L=Inveruno/O=Myfirm S.p.A./OU=Servizi Web/CN=crm.myfirm.com/emailAddress=me@myfirm.com
Getting CA Private Key
Enter pass phrase for myfirm-CA.key:unabellapasswordlungaecomplicata

e abbiamo il nostro bel certificato pronto per essere usato.

Nota a margine, per la prima volta in assoluto da quando compio questa operazione apache2 non ha funzionato al primo colpo, adesso non so se l’apache di Ubuntu è diverso da quello di Debian, se questa macchina è nata sotto una cattiva stella, se Mr Murphy s’è ricordato del sottoscritto o che altro ma le cose stanno così.
Riassumo brevemente qui il problema e la soluzione anche se effettivamente è una questione di apache, in sostanza all’avvio di apache il log diceva:

[Fri Oct 12 14:28:20 2012] [error] Init: Private key not found
[Fri Oct 12 14:28:20 2012] [error] SSL Library Error: 218529960 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Fri Oct 12 14:28:20 2012] [error] SSL Library Error: 218640442 error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error
[Fri Oct 12 14:28:20 2012] [error] SSL Library Error: 218529960 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Fri Oct 12 14:28:20 2012] [error] SSL Library Error: 218595386 error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error
[Fri Oct 12 14:28:20 2012] [error] SSL Library Error: 67710980 error:04093004:rsa routines:OLD_RSA_PRIV_DECODE:RSA lib
[Fri Oct 12 14:28:20 2012] [error] SSL Library Error: 218529960 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Fri Oct 12 14:28:20 2012] [error] SSL Library Error: 218595386 error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error

uh? WTF??? l’hai la chiave fesso è  in /etc/ssl/ditta che vai cercando?
Googlando trovo la direttiva  SSLCertificateKeyFile in buona sostanza il path dove cercare la chiave,  e aggiungo al mio /etc/apache2/sites-avaible/crm.myfirm.com la direttiva con il relativo path SSLCertificateKeyFile /etc/ssl/ditta/crm.myfirm.com.key
al successivo apache2 restart mi chiede la password se la metto io a manina funziona se la macchina fa reboot non parte apache2 e  il log presenta una cosa di questo tipo:

[Fri Oct 12 16:16:23 2012] [error] Init: Pass phrase incorrect
[Fri Oct 12 16:16:23 2012] [error] SSL Library Error: 218529960 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Fri Oct 12 16:16:23 2012] [error] SSL Library Error: 218640442 error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error
[Fri Oct 12 16:16:23 2012] [error] SSL Library Error: 218529960 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Fri Oct 12 16:16:23 2012] [error] SSL Library Error: 218595386 error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error
[Fri Oct 12 16:16:23 2012] [error] SSL Library Error: 67710980 error:04093004:rsa routines:OLD_RSA_PRIV_DECODE:RSA lib
[Fri Oct 12 16:16:23 2012] [error] SSL Library Error: 218529960 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Fri Oct 12 16:16:23 2012] [error] SSL Library Error: 218595386 error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error

1/4 d’ora di bestemmie dopo ricominco le ricerche in rete, e trovo la direttiva  SSLPassPhraseDialog che inserisco nel mio sito crm.myfirm.com con questa scrittura:

SSLPassPhraseDialog exec:/etc/ssl/ditta/funzionamaledetto (se per caso il lettore pensa che a questo punto fossi lievemente “alterato” ha perfettamente ragione) creo sotto /etc/ssl/ditta/ il file funzionamaledetto che contiene:
#!/bin/sh
echo “unabellapasswordlungaecomplicata”

riavvio apache2 e il risultato è
SSLPassPhraseDialog cannot occur within section

e ma che $fallo!!!!!!!!! allora ce l’hai con me!!!!!!!

ho risolto togliendo SSLPassPhraseDialog exec:/etc/ssl/ditta/funzionamaledetto da crm.myfirm.com e mettendola in apache2.conf subito prima dell’include dei siti praticamente alla fine.

 


Categorised as: Linux | Sistemi operativi | Work

Comments are disabled on this post


Comments are closed.