di seguito i link per fare il download di Open SSL:
https://tecadmin.net/install-openssl-on-windows/
https://github.com/openssl/openssl/blob/master/INSTALL.md#unix--linux--macos-1
[In questo esempio è stato utilizzato un server con CentOS]
/root
|-- ca
| |-- certs/
| |-- crl/
| |-- index.txt
| |-- newcerts/
| |-- openssl.cnf
| |-- private/
|-- openssl.cnf
| |-- serial
ca/certs -> conterrà i certificati della certification authority ca/crl -> conterrà le richieste di certification ca/index.txt -> file che tiene traccia dei certificati firmati ca/serial --> file che tiene traccia dei certificati firmati ca/private/ -> contiene le chiavi private della c.a. ca/openssl.cnf -> Contiene le configurazioni di openssl, in questo modo openssl saprà come comportarsi di fronte alle situazione di creazione di chiavi, certificati o revoca.
I comandi da usare per ottenere questa struttura sono
cd /root/
mkdir /root/ca
cd /root/ca
mkdir certs crl newcerts private
chmod 700 private
touch index.txt
echo 1000 > serial
Come configurato nel file openssl.cnf il nome sarà ca.key.pem e verrà salvata nella directory private/
cd /root/ca
openssl genrsa -aes256 -out private/ca.key.pem 4096
# il terminale vi chiederà una passphrase per generare la vostra chiave privata
# successivamente vi chiederà di riscriverla a scopo di verifica
#adesso rendiamo inaccessibile questa chiave a utenti mailntenzionati
chmod 400 private/ca.key.pem
L'ultimo numero è il numero di bit per la chiave, viene scelto 4096 bit piuttosto che 2048 poichè la rootCA deve avere una robustezza e sicurezza maggiore poichè il suo certificato deve valere molti anni (anche 20 anni)
cd /root/ca
openssl req -config openssl.cnf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem
Vi verrà chiesto di inserire la passphrase inserita in precedenza per generare la chiave privata e poi una serie di dati inerenti la rootCA.
Mettiamo in sicurezza anche il certificato
chmod 444 certs/ca.cert.pem
openssl x509 -noout -text -in certs/ca.cert.pem
Quando si parla in termini di C.A. si parla in termini gerarcici, in genere la rootCA non è esposta, ma bensì vengono creati gradi gerarchici di C.A. intermedie. In questo modo se venisse compromessa una di queste CA intermedie, la CA del livello superiore potrebbe revocare il certificato della CA compromessa e automaticamente questi verrebbero revocati.
/root/ca/
| |-- intermediate
| | |-- certs
| | |-- crl
| | |-- crlnumber
| | |-- csr
| | |-- index.txt
| | |-- openssl-intermediate.cnf
| | |-- newcerts
| | |-- openssl.cnf
| | |-- private
I comandi per aggiungere questa struttura sono
cd /root/
mkdir /root/ca
cd /root/ca
mkdir certs crl newcerts private
chmod 700 private
touch index.txt
echo 1000 > serial
echo 1000 > /root/ca/intermediate/crlnumber
[crlnumber è utilizzato per tenere traccia della lista dei certificati revocati (certificate revocation list)]
cd /root/ca/intermediate
cp ../openssl.cnf ./openssl-intermediate.cnf
nel file openssl-intermediate.cnf andranno modificati alcuni parametri come segue
[ CA_default ]
dir = /root/ca/intermediate
private_key = $dir/private/intermediate.key.pem
certificate = $dir/certs/intermediate.cert.pem
crl = $dir/crl/intermediate.crl.pem
policy = policy_loose
Come fatto in precedenza
cd root/ca
openssl genrsa -aes256 -out intermediate/private/intermediate.key.pem 4096
# Vi verrà chiesto di creare la passphrase per la chiave privata della CA intermedia
chmod 400 intermediate/private/intermediate.key.pem
[il file di configurazione usato è intermediate/openssl.cnf]
cd /root/ca openssl req -config intermediate/openssl.cnf -new -sha256 -key intermediate/private/intermediate.key.pem -out intermediate/csr/intermediate.csr.pem
Verranno richieste informazioni della CA intermedia che poi saranno incorporate nel certificato.
cd /root/ca
openssl ca -config openssl.cnf -extensions v3_intermediate_ca -days 3650 -notext -md sha256 -in intermediate/csr/intermediate.csr.pem -out intermediate/certs/intermediate.cert.pem
# Verrà richiesto di inserire la passphrase della rootCA e poi se si intende firmare il certificato
#Mettiamo in sicurezza il certificato ottenuto
chmod 444 intermediate/certs/intermediate.cert.pem
cat intermediate/certs/intermediate.cert.pem certs/ca.cert.pem > intermediate/certs/ca-chain.cert.pem
chmod 444 intermediate/certs/ca-chain.cert.pem
creare la chiave pubblica e privata, certificato autofirmato per la certification authority (in questo caso valido 365 giorni)
Sostituire il valore dell'argomento -subj con i propri dati
openssl req -config ./openssl-ca.cnf -new -x509 -days 365 -sha256 -newkey rsa:2048 -keyout ./options/ca/private/ca.key -subj "/C=IT/ST=Italy/O=Test Certification Authority/CN=www.test-certification-authority.it" -out ./options/ca/ca.crt
Inserire la password e la verifica della password NB: Questa password andrà ricordata e applicata ogni qualvolta la C.A. dovrà firmare certificato
Da Aggiungere schermata e spiegazione dei dati su -subj
Cambiare i permessi di accesso alla chiave
chmod 700 ./options/ca
chmod 600 ./options/ca/private/ca.key
Prendere la chiave inserita dall'utente e posizionarla nella directory delle richieste (valido 90 giorni)
A questo punto il server C.A. è pronto per iniziare a creare i primi certificati L'utente inizialmente dovrà creare la propria chiave privata e caricarla sul server.
sostituire cognome.nome.matricola in minuscolo con i rispettivi dati senza spazi, accenti, apostrofi o altri caratteri speciali (altrimenti genera errore)
es1 mario.rossi.000001 = Mario Rossi 000001 es2 mario.pasto.000002 = Mario Pastò 000002 es3 fra.martin.000003 = Fra' Martino 000003
Il seguente comando genera una chiave privata di lunghezza 2048, il cui nome del file è cognome.nome.matricola.key.pem
openssl genrsa -out cognome.nome.matricola.key.pem 2048
sostituire matricola con la propria matricola es -out 000001.csr.pem
Questo comando genera una richiesta di certificazione, che può essere inviata ad una certification authority
openssl req -new -sha256 -key cognome.nome.matricola.key.pem -subj "/C=IT/ST=Italy/O=UniPD/OU=Studente/CN=cognome.nome.matricola" -out matricola.csr.pem
Abbiamo ottenuto due file cognome.nome.matricola.key.pem <-- la nostra chiave privata matricola.csr.pem <--- il file da caricare sul server per ricevere il certificato
[l'interfaccia che si occuperà del caricamento del file .csr.pem dovrà posizionare tale file nella directory intermediate/csr/]
cd /root/ca
openssl ca -config intermediate/openssl.cnf -extensions server_cert -days 375 -notext -md sha256 -in intermediate/csr/matricola.csr.pem -out intermediate/certs/matricola.cert.pem
chmod 444 intermediate/certs/matricola.cert.pem
openssl x509 -noout -text \
-in intermediate/certs/matricola.cert.pem
Modficare il file intermediate/openssl.cnf modificando il parametro crlDistributionPoints come segue
[ server_cert ]
crlDistributionPoints = URI:http://nostroDominio.ext/intermediate.crl.pem
cd /root/ca
openssl ca -config intermediate/openssl.cnf -gencrl -out intermediate/crl/intermediate.crl.pem
#puoi controllare il contenuto della crl con il comando
openssl crl -in intermediate/crl/intermediate.crl.pem -noout -text
openssl ca -config intermediate/openssl.cnf -revoke intermediate/certs/certificatoDaRevocare.cert.pem
openssl x509 -outform der -in nomeCertificato.cert.pem -out nomeCertificato.der
openssl crl2pkcs7 -nocrl -certfile nomeCertificato.cert.pem -out nomeCertificato.p7b -certfile intermediate.cert.pem
openssl pkcs12 -export -out nomeCertificato.pfx -inkey privateKey.key -in nomecertificato.cert.pem -certfile intermediate.cert.pem
#creare la chiave pubblica e privata, certificato autofirmato per la certification authority
#UTENTE
cd %UserProfile%\Desktop
##creo la chiave privata per l'utente
openssl genrsa -out rossi.mario.0000001.key.pem 2048
##creo la certification request da parte dell'utente
openssl req -new -sha256 -key rossi.mario.0000001.key.pem -subj "/C=IT/ST=Italy/O=UniPD/OU=Studente/CN=rossi.mario.0000001" -out 0000001.csr.pem
Lo studente ora caricherà il file .csr.pem nell'interfaccia online per la generazione del certificato e otterrà il suo certificato .cert.pem
Per utilizzarlo per firmare i file dovrà convertirlo in relazione al formato richiesto dal programma di firma
Nella stessa cartella della chiave va posizionato il file da firmare, in questo caso demofile.txt Questo comando genera la firma del file demofile.txt utilizzando la chiave privata rossi.mario.0000001.key.pem
openssl dgst -sha256 -sign rossi.mario.0000001.key.pem -out demofile.txt.sha256 demofile.txt
Verrà creato un file chiamato demofile.txt.sha256, corrispondente alla firma del file
La seguente riga di comando funziona anche sui sistemi Unix/Linux/MacOS, ma è un passaggio necessario solo su Windows Questo comando estrae da 0000001.cert.pem la corrispondente chiave pubblica e la salva come 0000001.public.key.pem
openssl x509 -pubkey -noout -in 0000001.cert.pem > 0000001.public.key.pem
Questo comando verifica che il file demofile.txt sia stato firmato con la chiave privata associata alla chiave pubblica 0000001.public.key.pem
openssl dgst -sha256 -verify 0000001.public.key.pem -signature demofile.txt.sha256 demofile.txt
In caso la firma sia verificata questo è l'output previsto
Verified OK
Questo comando verifica che il file demofile.txt sia stato firmato con la chiave privata associata al certificato 0000001.cert.pem
openssl dgst -sha256 -verify <(openssl x509 -in 0000001.cert.pem -pubkey -noout) -signature demofile.txt.sha256 demofile.txt
In caso la firma sia verificata questo è l'output previsto
Verified OK
Il file ca-chain.cert.pem va scaricato dal sito della Certification Authority e posizionato nella stessa cartella di 0000001.cert.pem
openssl verify -CAfile ca-chain.cert.pem 0000001.cert.pem
In caso di esito positivo
0000001.cert.pem: OK
Questo comando esporta in formato p12 la chiave privata rossi.mario.0000001.key.pem, proteggendola con una password
openssl pkcs12 -export -inkey rossi.mario.0000001.key.pem -in 0000001.cert.pem -out 0000001.p12
Verrà chiesta una password e la conferma di essa; è consigliato scegliere una password sicura. La password non viene mostrata nè salvata da alcuna parte quindi va scritta, preferibilmente su supporto non informatico (foglio di carta). Una volta generato il file p12 è possibile copiarlo su USB.
Questo comando estrae dal file p12 la chiave privata
openssl pkcs12 -in 0000001.p12 -out rossi.mario.0000001.estratta.key.pem -nodes
Verrà chiesta la password con cui è stato generato il file p12