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:
- 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.
- 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 alocalhost, includiDNS.1 = localhost. Se risponde a un nome di dominio locale, includi quello. Puoi aggiungere piùDNSoIPa 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 sezionev3_extdel 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
- Fare doppio clic sul file
tuo_dominio.local.crt. - Si aprirà la finestra “Certificato”. Clicca su “Installa certificato…”.
- Seleziona “Utente corrente” o “Computer locale” (se hai i permessi di amministratore, scegli “Computer locale” per renderlo disponibile a tutti gli utenti). Clicca “Avanti”.
- Seleziona “Posiziona tutti i certificati nell’archivio seguente” e clicca su “Sfoglia…”.
- Seleziona “Autorità di certificazione radice attendibili” e clicca “OK”.
- Clicca “Avanti” e poi “Fine”.
- Potrebbe apparire un avviso di sicurezza. Clicca “Sì” per confermare l’installazione.
macOS
- Fare doppio clic sul file
tuo_dominio.local.crt. - Si aprirà l’applicazione “Accesso Portachiavi” (Keychain Access).
- Nella finestra di dialogo, seleziona il portachiavi “Sistema” (System) e clicca “Aggiungi” (Add).
- Ti verrà chiesta la password di amministratore.
- Una volta aggiunto, il certificato apparirà nel portachiavi “Sistema”. Fai doppio clic sul certificato appena aggiunto.
- Si aprirà una finestra con i dettagli del certificato. Espandi la sezione “Fiducia” (Trust).
- Nel menu a discesa accanto a “Quando si usa questo certificato” (When using this certificate), seleziona “Considera sempre attendibile” (Always Trust).
- 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.
- Crea una directory per i certificati extra: Bash
sudo mkdir -p /usr/local/share/ca-certificates/extra - Copia il tuo certificato nella directory creata: Bash
sudo cp tuo_dominio.local.crt /usr/local/share/ca-certificates/extra/tuo_dominio.local.crt - Aggiorna l’elenco dei certificati CA: Bash
sudo update-ca-certificatesDovresti 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 iSubject 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 fileopenssl.cnfe 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
.keye.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.