Creazione di certificati auto-firmati

Un certificato auto-firmato è un certificato digitale NON firmato da un’autorità di certificazione (CA) pubblica o privata riconosciuta. Invece, è firmato dalla stessa entità che utilizza il certificato, nota anche come me stesso. I certificati auto-firmati vengono comunemente utilizzati per testare o per garantire la comunicazione all’interno di una rete privata.

Creare un certificato auto-firmato è un compito relativamente semplice e può essere fatto utilizzando OpenSSL, uno strumento/biblioteca crittografico open-source ampiamente utilizzato.

Ecco una guida semplice su come creare un certificato auto-firmato. Seguiamo questi passi:

  • Installa gli strumenti necessari
  • Creare la tua CA
  • Creare una chiave privata per generare il CSR
  • Creare un certificato con il CSR, la CA e la chiave privata
  • Utilizzando il certificato auto-firmato

Sto usando Ubuntu Linux 20.04 per generare un certificato, ma i comandi dovrebbero essere simili per altre sistemi Linux.

Se non hai OpenSSL installato, usa apt, yum, rpm, codice sorgente o qualsiasi cosa per installarlo.

Su Ubuntu e sistemi simili a Debian, puoi installarlo con la seguente riga di comando:

sudo apt install openssl -y

Ora crea una directory per mettere i tuoi file da generare con il comando:

mkdir mycertificate && cd mycertificate

Prima di generare un certificato, avrai bisogno della tua CA (Autorità di Certificazione) per firmarlo, come detto in precedenza. Usa questo comando per generare la CA:

openssl req -x509 \
-sha256 -days 3560 \
-nodes \
-newkey rsa:2048 \
-subj "/CN=my.domain.com/C=BR/ST=Bahia/L=Salvador" \
-keyout CA.key -out CA.crt

Questo comando genererà un certificato CA e la sua chiave privata valida per 10 anni. Dovresti modificare il comando per adattarlo alle tue esigenze. Ecco i significati: CN (nome comune), C (nome del paese), ST (nome dello stato o della provincia) e L (località).

Il prossimo passo è generare una chiave privata utilizzando il seguente comando:

openssl genrsa -out server.key 2048

Ora creiamo un CSR (Richiesta di Firma del Certificato). Ma per creare un CSR scriveremo un file di configurazione:

cat > csr.conf <<EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C = BR
ST = Bahia
L = Salvador
O = MyOrganization
OU = MyOrganization Unit
CN = my.domain.com

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = my.domain.com
DNS.2 = www.my.domain.com
IP.1 = 192.168.0.254
IP.2 = 192.168.0.253

EOF

Ora esegui questo comando per generare il CSR:

openssl req -new \
-key server.key \
-config csr.conf \
-out server.csr

Questo creerà un nuovo file CSR chiamato server.csr nella directory corrente. Se ometti l’opzione -config csr.conf, ti verrà chiesto di inserire alcune informazioni sul certificato, come il paese, lo stato e il nome dell’organizzazione.

Dovresti avere questi file nella tua directory: CA.key, CA.crt, csr.conf, server.csr e server.key.

Ora creiamo un altro file di configurazione per il certificato finale:

cat > cert.conf <<EOF

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = my.domain.com

EOF

Per creare il certificato esegui questo comando:

openssl x509 -req \
-in server.csr \
-CA CA.crt -CAkey CA.key \
-CAcreateserial -out server.crt \
-days 3650 \
-sha256 -extfile cert.conf

Il comando dovrebbe generare un file chiamato server.crt e dovrebbe essere utilizzato con la chiave precedentemente generata. L’opzione -days specifica il numero di giorni in cui il certificato sarà valido.

Esempio di utilizzo con nginx:

server {
    listen 443 ssl;
    server_name my.domain.com www.my.domain.com;

    ssl_certificate /path/to/mycertificate/server.crt;
    ssl_certificate_key /path/to/mycertificate/server.key;
    
    location / {
        root /var/www/html/my.domain.com/;
        index index.html;
    }
}

Dopo aver generato il certificato auto-firmato, puoi usarlo per garantire la comunicazione tra due entità. Tuttavia, vale la pena notare che i browser web o i sistemi operativi non si fidano dei certificati auto-firmati per impostazione predefinita. Questo significa che se utilizzi un certificato auto-firmato su un sito web pubblico, i visitatori vedranno un messaggio di avviso nel proprio browser.

Se desideri utilizzare questo certificato su un gruppo di computer LAN, puoi aggiungere la CA all’elenco di fiducia del sistema operativo.

Su Ubuntu, puoi eseguire questi comandi:

cp CA.crt /usr/local/share/ca-certificates/my.ca.entity/CA.pem
sudo update-ca-certificates

Questo copierà la CA in /usr/local/share/ca-certificates/CA_FOLDER_NAME e creerà link alla cartella CA di fiducia con update-ca-certificates. Così la prossima volta che visiterai il sito di esempio, chrome non si lamenterà di un certificato “non fidato”

ci vediamo!