Configurazione di Certificati
OpenSSL
E' un toolkit Open Source robusto, sicuro e completo per la gestione di protocolli Transport Layer Security (TLS) e Secure Sockets Layer (SSL).
E' anche una libreria generica con molte utility crittografiche.
openssl
OpenSSL> help
Standard commands
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dhparam
dsa dsaparam ec ecparam
enc engine errstr gendsa
genpkey genrsa help list
nseq ocsp passwd pkcs12
pkcs7 pkcs8 pkey pkeyparam
pkeyutl prime rand rehash
........
openssl comando opzioni argomenti
Scenario
-
Un Soggetto, p.es. un Web Server (chi lo amministra) genera una coppia di chiavi, pubblica e privata.
-
Il Soggetto invia una Richiesta di Certificato (CR - Certificate Request) ad un'Autorità di Certificazione (CA - Certifying Authority). La CR contiene i dati di identità del Soggetto e la sua Chiave Pubblica.
-
La CA possiede un Autocertificato (SSC - Self-Signed Certificate), di cui ci si fida a priori, ed una Infrastruttura di Certificazione.
-
La CA verifica i dati di identità della CR.
-
La CA genera un Certificato Soggetto (SC - Subject Certificate) e lo invia al Soggetto richiedente.
-
Il Soggetto configura il Web Server con il SC ricevuto.
Prepariamo una directory per l'esercizio:
mkdir -p ~/ex/cert
cd ~/ex/cert
Certificate Request
Creazione di una nuova Chiave Privata e Certificate Signing Request:
openssl req -out geekflare.csr -newkey rsa:2048 -nodes -keyout geekflare.key
Generating a RSA private key
............
writing new private key to 'geekflare.key'
-----
You are about ....
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:NSW
Locality Name (eg, city) []:Sydney
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:Development
Common Name (e.g. server FQDN or YOUR name) []:geekflare.com
Email Address []:boss@geekflare.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []:GeekFlare
Self-Signed Certificate
Creazione di un Self-Signed Certificate per una Root CA:
openssl req -x509 -sha256 -nodes -newkey rsa:2048 -keyout gfselfsigned.key -out gfcert.pem
Generating a RSA private key
..........
writing new private key to 'gfselfsigned.key'
-----
You are about to be asked ...
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:Washington
Locality Name (eg, city) []:Seattle
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Microsoft
Organizational Unit Name (eg, section) []:World Control
Common Name (e.g. server FQDN or YOUR name) []:world.ms.com
Email Address []:galacticboss@ms.com
Configurazione di CA
Creare un file minimo di configurazione per una CA:
vim ca.conf
[ ca ]
default_ca = ca_default
[ ca_default ]
dir = ./ca
certs = $dir
new_certs_dir = $dir/ca.db.certs
database = $dir/ca.db.index
serial = $dir/ca.db.serial
RANDFILE = $dir/ca.db.rand
certificate = $dir/ca.crt
private_key = $dir/ca.key
default_days = 365
default_crl_days = 30
default_md = sha256
preserve = no
policy = generic_policy
[ generic_policy ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = optional
emailAddress = optional
Osservazioni:
- Questo è un file di configurazione molto ridotto e poco sicuro. Viene usato solo per scopi didattici.
- Il parametro
default_md
descrive l'algoritmo di firma del certificato. Apache moderno accetta in categoriaHIGH
solo algoritmi ad almeno 256 bit. Così il vecchio defaultmd5
non va bene, mentresha256
va bene.
Infrastruttura CA
Creare la directory di database del CA ed alcune altre directory e file necessari, che manterranno informazioni sui certificati emessi:
mkdir ca
cd ca
mkdir ca.db.certs
touch ca.db.index
echo "1234" > ca.db.serial
cd ..
Copiare il certificato autofirmato (root CA certificate) e chiave privata alla directory CA.
cp gfcert.pem ca/ca.crt
cp gfselfsigned.key ca/ca.key
Generare un Certificato
Ogni comando di gestione del CA deve contenere l'opzione che punta al file di configurazione, p.es. -config ca.conf
.
Firmare una Certificate Request e generare un certificato:
openssl ca -config ca.conf -out certificate.pem -infiles geekflare.csr
Using configuration from ca.conf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'AU'
stateOrProvinceName :ASN.1 12:'NSW'
localityName :ASN.1 12:'Sydney'
organizationName :ASN.1 12:'Internet Widgits Pty Ltd'
organizationalUnitName:ASN.1 12:'Development'
commonName :ASN.1 12:'geekflare.com'
emailAddress :IA5STRING:'boss@heekflare.com'
Certificate is to be certified until Sep 8 09:19:15 2022 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Altre Operazioni
La utility openssl
possiede numerose possibilità. Alcune sono:
Verificare il file CSR:
openssl req -noout -text -in geekflare.csr
Da in output il contenuto ASCII della richiesta.
Creare una chiave privata RSA:
openssl genrsa -out private.key 2048
In realtà il comando produce un singolo file ove sono descritte sia la chiave privata che quella pubblica.
Estrarre la chiave pubblica RSA:
openssl rsa -in private.key -pubout > public.pub
Verificare una chiave privata:
openssl rsa -in private.key --check
Verificare la Certificate Signer Authority:
openssl x509 -in certificate.pem -noout -issuer -issuer_hash
issuer=C = US, ST = Washington, L = Seattle, O = Microsoft,
OU = World Control, CN = world.ms.com,
emailAddress = galacticboss@ms.com
2f06f056
Controllare il valore hash di un certificato:
openssl x509 -noout -hash -in certificate.pem
3543b6f5
Revocare un certificato:
Esempio:
openssl ca -revoke ca/ca.db.certs/1234.pem -config ca.conf
Una revoca adeguata coinvolgerebbe anche la gestione di un Certificate Revocation List (CRL), che qui non viene compiuta. Comunque pochi browser controllano i CRL.
Semplicemente non installare in Apache dei certificati revocati.