in Architettura Software, Informatica

Creare un Certificato HTTPS Self-Signed Valido

Creare un certificato HTTPS self-signed (autofirmato) è un modo rapido per abilitare il traffico HTTPS su un server di sviluppo o un’applicazione locale, senza dover ottenere un certificato da un’autorità di certificazione (CA) riconosciuta. Tuttavia, Chrome e altri browser moderni sono diventati più stringenti sui certificati autofirmati per motivi di sicurezza. Questo documento ti guiderà attraverso le procedure necessarie per creare un certificato self-signed che Chrome accetterà, riducendo al minimo gli avvisi di sicurezza.

Perché i Certificati Self-Signed Sono Problematici per Chrome?

I browser come Chrome si affidano a un sistema di fiducia basato sulle CA. Quando un browser visita un sito HTTPS, controlla che il certificato sia stato emesso da una CA che riconosce e si fida. Un certificato self-signed, non essendo emesso da una CA riconosciuta, fa scattare un avviso di sicurezza perché il browser non può verificarne l’autenticità.

Per far sì che Chrome accetti un certificato self-signed, è necessario:

  1. Creare un certificato con i parametri corretti: Includere il nome del dominio o l’indirizzo IP corretto, specificare gli “Subject Alternative Names” (SAN) e impostare le “Extended Key Usage” (EKU) appropriate.
  2. Installare il certificato come “Trusted Root Certification Authority” (CA radice attendibile): Questo indica a Chrome e al sistema operativo di fidarsi di questo certificato come se fosse stato emesso da una CA riconosciuta.

Strumenti Necessari

Per seguire queste procedure, avrai bisogno di:

  • OpenSSL: Un toolkit crittografico per la generazione di chiavi, richieste di certificati e certificati digitali. È preinstallato sulla maggior parte dei sistemi Linux e macOS. Su Windows, puoi installarlo tramite Cygwin o WSL (Windows Subsystem for Linux), oppure scaricare una versione precompilata (ad esempio, da Shining Light Productions).

Procedura Dettagliata

1. Creare un File di Configurazione OpenSSL (Optional ma Consigliato)

Creare un file di configurazione per OpenSSL rende il processo più semplice e riproducibile, garantendo che tutti i parametri necessari siano inclusi. Crea un file chiamato openssl.cnf (o un nome simile) con il seguente contenuto. Assicurati di sostituire tuo_dominio.local con il nome di dominio o l’indirizzo IP che userai per il tuo server locale. Se stai usando localhost, puoi lasciarlo così com’è.

Ini, TOML

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C = IT               # Codice Paese (es. IT per Italia)
ST = Piemonte        # Stato o Provincia
L = Tortona          # Località
O = LaMiaOrganizzazione # Nome della tua organizzazione
OU = Sviluppo        # Unità organizzativa
emailAddress = admin@tuo_dominio.local # Indirizzo email
CN = tuo_dominio.local # Common Name (Nome di dominio o IP)

[v3_ext]
subjectAltName = @alt_names
extendedKeyUsage = serverAuth

[alt_names]
DNS.1 = tuo_dominio.local  # Il tuo dominio o hostname
DNS.2 = localhost          # Se usi localhost
IP.1 = 127.0.0.1           # Se usi l'IP locale

Spiegazione delle Sezioni Importanti:

  • [req]: Configura i parametri generali per la richiesta di certificato.
  • [dn]: Definisce i campi del “Distinguished Name” del certificato.
    • CN (Common Name): È cruciale che questo corrisponda al nome di dominio o all’indirizzo IP che utilizzerai per accedere al tuo server.
  • [v3_ext]: Specifica le estensioni X.509 v3, fondamentali per la compatibilità con Chrome.
    • subjectAltName (SAN): Questa è la parte più importante per la validazione di Chrome. Specifica tutti i nomi di dominio e gli indirizzi IP sotto i quali il tuo server sarà accessibile. Se il tuo server risponde solo a localhost, includi DNS.1 = localhost. Se risponde a un nome di dominio locale, includi quello. Puoi aggiungere più DNS o IP a seconda delle tue esigenze.
    • extendedKeyUsage = serverAuth: Indica che il certificato è destinato all’autenticazione del server, un requisito per i certificati web.

2. Generare la Chiave Privata e la Richiesta di Firma del Certificato (CSR)

Ora useremo OpenSSL per generare una chiave privata e una CSR (Certificate Signing Request). La CSR è un file che contiene le informazioni del certificato che desideri creare.

Apri il terminale o il prompt dei comandi e naviga nella directory dove hai salvato openssl.cnf.

Bash

openssl req -x509 -newkey rsa:2048 -nodes -keyout tuo_dominio.local.key -out tuo_dominio.local.crt -sha256 -days 365 -config openssl.cnf -extensions v3_ext

Spiegazione del Comando:

  • req: Indica che stiamo generando una richiesta di certificato.
  • -x509: Crea un certificato autofirmato anziché una CSR (quindi agisce anche come CA).
  • -newkey rsa:2048: Genera una nuova chiave privata RSA di 2048 bit.
  • -nodes: Non crittografa la chiave privata (utile per lo sviluppo, ma attenzione in produzione).
  • -keyout tuo_dominio.local.key: Specifica il nome del file per la chiave privata generata.
  • -out tuo_dominio.local.crt: Specifica il nome del file per il certificato generato (che è anche il certificato autofirmato in questo caso).
  • -sha256: Utilizza l’algoritmo di hashing SHA256.
  • -days 365: Imposta la validità del certificato a 365 giorni. Puoi aumentare questo valore se necessario.
  • -config openssl.cnf: Specifica il file di configurazione da utilizzare.
  • -extensions v3_ext: Indica a OpenSSL di usare la sezione v3_ext del file di configurazione per le estensioni.

Dopo aver eseguito questo comando, avrai due file nella tua directory:

  • tuo_dominio.local.key: La tua chiave privata. Mantienila al sicuro!
  • tuo_dominio.local.crt: Il tuo certificato autofirmato.

3. Installare il Certificato nel Sistema Operativo

Questo è il passaggio cruciale per far sì che Chrome e altri browser si fidino del tuo certificato. Dovrai installare il file .crt come “Trusted Root Certification Authority” nel tuo sistema operativo. La procedura varia leggermente a seconda del sistema operativo.

Windows
  1. Fare doppio clic sul file tuo_dominio.local.crt.
  2. Si aprirà la finestra “Certificato”. Clicca su “Installa certificato…”.
  3. Seleziona “Utente corrente” o “Computer locale” (se hai i permessi di amministratore, scegli “Computer locale” per renderlo disponibile a tutti gli utenti). Clicca “Avanti”.
  4. Seleziona “Posiziona tutti i certificati nell’archivio seguente” e clicca su “Sfoglia…”.
  5. Seleziona “Autorità di certificazione radice attendibili” e clicca “OK”.
  6. Clicca “Avanti” e poi “Fine”.
  7. Potrebbe apparire un avviso di sicurezza. Clicca “Sì” per confermare l’installazione.
macOS
  1. Fare doppio clic sul file tuo_dominio.local.crt.
  2. Si aprirà l’applicazione “Accesso Portachiavi” (Keychain Access).
  3. Nella finestra di dialogo, seleziona il portachiavi “Sistema” (System) e clicca “Aggiungi” (Add).
  4. Ti verrà chiesta la password di amministratore.
  5. Una volta aggiunto, il certificato apparirà nel portachiavi “Sistema”. Fai doppio clic sul certificato appena aggiunto.
  6. Si aprirà una finestra con i dettagli del certificato. Espandi la sezione “Fiducia” (Trust).
  7. Nel menu a discesa accanto a “Quando si usa questo certificato” (When using this certificate), seleziona “Considera sempre attendibile” (Always Trust).
  8. Chiudi la finestra. Ti verrà chiesta di nuovo la password di amministratore per salvare le modifiche.
Linux (Ubuntu/Debian-based)

La procedura su Linux coinvolge la copia del certificato in una directory specifica e l’aggiornamento del trust store.

  1. Crea una directory per i certificati extra: Bashsudo mkdir -p /usr/local/share/ca-certificates/extra
  2. Copia il tuo certificato nella directory creata: Bashsudo cp tuo_dominio.local.crt /usr/local/share/ca-certificates/extra/tuo_dominio.local.crt
  3. Aggiorna l’elenco dei certificati CA: Bashsudo update-ca-certificates Dovresti vedere un output che indica che il tuo certificato è stato aggiunto.

4. Configurare il Tuo Server Web (o Applicazione) per Usare HTTPS

Infine, devi configurare il tuo server web (es. Apache, Nginx, Node.js Express, Python Flask) per utilizzare la chiave privata (.key) e il certificato (.crt) che hai appena generato. La configurazione specifica dipenderà dal server che stai usando.

Esempio (Node.js con Express):

JavaScript

const express = require('express');
const https = require('https');
const fs = require('fs');

const app = express();

// Carica la chiave privata e il certificato
const privateKey = fs.readFileSync('tuo_dominio.local.key', 'utf8');
const certificate = fs.readFileSync('tuo_dominio.local.crt', 'utf8');

const credentials = { key: privateKey, cert: certificate };

app.get('/', (req, res) => {
  res.send('Ciao, mondo HTTPS!');
});

const httpsServer = https.createServer(credentials, app);

httpsServer.listen(8443, () => {
  console.log('Server HTTPS in ascolto sulla porta 8443');
});

Esempio (Nginx):

Nginx

server {
    listen 443 ssl;
    server_name tuo_dominio.local localhost 127.0.0.1; # Assicurati che corrisponda ai tuoi SAN

    ssl_certificate /path/to/tuo_dominio.local.crt;
    ssl_certificate_key /path/to/tuo_dominio.local.key;

    # Altre configurazioni SSL/TLS raccomandate per la sicurezza
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s; # Utilizza i DNS che preferisci
    resolver_timeout 5s;

    location / {
        proxy_pass http://localhost:3000; # O il tuo backend
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Ricorda di adattare i percorsi ai tuoi file .crt e .key nella configurazione del server.

Verificare il Certificato in Chrome

Dopo aver installato il certificato e configurato il server, apri Chrome e naviga verso l’indirizzo HTTPS del tuo server (es. https://tuo_dominio.local:8443 o https://localhost:8443).

Se tutto è stato configurato correttamente, dovresti vedere l’icona del lucchetto nella barra degli indirizzi e Chrome non dovrebbe mostrare avvisi di sicurezza sul certificato. Puoi cliccare sul lucchetto per vedere i dettagli del certificato e verificare che sia stato emesso dalla “tua” CA (che in questo caso sei tu stesso).

Risoluzione dei Problemi Comuni

  • Avviso “NET::ERR_CERT_COMMON_NAME_INVALID” o “NET::ERR_CERT_AUTHORITY_INVALID”: Questo significa che il Common Name (CN) o i Subject Alternative Names (SAN) nel certificato non corrispondono all’URL che stai cercando di visitare, oppure che il certificato non è stato installato correttamente come “Trusted Root CA”. Rivedi il tuo file openssl.cnf e i passaggi di installazione.
  • Certificato non riconosciuto dopo l’installazione: Assicurati di aver riavviato il browser dopo l’installazione del certificato. Su alcune piattaforme, potrebbe essere necessario riavviare il sistema operativo.
  • Problemi con i permessi: Assicurati che il tuo server web abbia i permessi per leggere i file .key e .crt. La chiave privata in particolare dovrebbe avere permessi restrittivi.
  • “This site can’t provide a secure connection”: Controlla che il tuo server sia effettivamente in ascolto sulla porta HTTPS corretta e che non ci siano firewall che bloccano la connessione.

Seguendo attentamente questi passaggi, sarai in grado di creare e utilizzare un certificato HTTPS self-signed che sarà accettato da Chrome, rendendo il tuo ambiente di sviluppo locale più simile a un ambiente di produzione con traffico crittografato.