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

  1. Un Soggetto, p.es. un Web Server (chi lo amministra) genera una coppia di chiavi, pubblica e privata.

  2. 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.

  3. La CA possiede un Autocertificato (SSC - Self-Signed Certificate), di cui ci si fida a priori, ed una Infrastruttura di Certificazione.

  4. La CA verifica i dati di identità della CR.

  5. La CA genera un Certificato Soggetto (SC - Subject Certificate) e lo invia al Soggetto richiedente.

  6. 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 categoria HIGH solo algoritmi ad almeno 256 bit. Così il vecchio default md5 non va bene, mentre sha256 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.