
Configurare certificati SSL locali è spesso uno dei primi passi per garantire connessioni sicure durante lo sviluppo e il testing di applicazioni web.
Tuttavia ottenere certificati attendibili senza complicazioni può diventare un processo lungo e poco intuitivo.
In questo contesto mkcert si presenta come uno strumento semplice e potente, capace di generare certificati HTTPS validi a livello locale senza dover ricorrere a provider esterni.
In combinazione con mkcertWeb, un’interfaccia web pensata per facilitarne l’uso anche su server remoti, è possibile creare un ambiente di sviluppo sicuro e perfettamente funzionante in pochi minuti.
In questo articolo vedremo come installare e configurare mkcert e mkcertWeb su Ubuntu Server 24.04, partendo dai requisiti essenziali fino alla generazione del primo certificato.
L’obiettivo è guidarti passo dopo passo nella creazione di un setup affidabile, ripetibile e facilmente gestibile, ideale per sviluppatori, amministratori di sistema e chiunque desideri migliorare la sicurezza dei propri ambienti di lavoro.
PREREQUISITI
Ubuntu Server 24.04 LTS
Utente appartenente al gruppo sudo
Accesso shell/SSH funzionante
AGGIORNAMENTO DEL SISTEMA
Eseguire i comandi:
|
0 1 |
sudo apt update sudo apt install -y git build-essential openssl |
INSTALLAZIONE DI MKCERT
Installare mkcert con trust store locale con i seguenti comandi:
|
0 1 2 |
sudo apt install -y mkcert libnss3-tools mkcert -install |
Dovremmo vedere il seguente output:
Created a new local CA
The local CA is now installed in the system trust store! ⚡️
Per verificare la versione di mkcert installata eseguire il comando:
|
0 |
mkcert -version |
Dovremmo visualizzare un outptu simile al seguente:
|
0 |
1.4.4 |
INSTALLAZIONE DI NODEJS
mkcertWeb richiede Node.js per poter funzionare.
Su Ubuntu 24.04 installare una LTS recente via NodeSource con i seguenti comandi:
|
0 1 2 3 |
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt install -y nodejs node -v npm -v |
Al termine dovremmo visualizzre un output simile al seguente:
|
0 1 |
v20.19.5 10.8.2 |
PREPRAZIONE DELL’AMBIENBTE MKCERTWEB
Clonare mkcertWeb e preparare l’ambiente
Scegliere una directory /opt e posizionarsi con il comando:
|
0 |
cd /opt |
Quindi clonare mkcertweb con il comando:
|
0 |
sudo git clone https://github.com/jeffcaldwellca/mkcertWeb.git |
Attribuire le ACL con il comando:
|
0 |
sudo chown -R "$USER":"$USER" mkcertWeb |
Posisizionarsi nella cartella mkcertweb con il comando:
|
0 |
cd mkcertWeb |
INSTALLAZIONE DELLE DIPENDENZE DI NODE
Installare NPM con il comando:
|
0 |
sudo npm install |
Dovremmo visualizzare il seguente output:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
added 224 packages, and audited 225 packages in 7s 42 packages are looking for funding run `npm fund` for details 1 high severity vulnerability To address all issues, run: npm audit fix Run `npm audit` for details. npm notice npm notice New major version of npm available! 10.8.2 -> 11.6.2 npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.6.2 npm notice To update run: npm install -g npm@11.6.2 npm notice |
Nel caso aggiornare all’ultima major release come indicato nell’output sovrastante con il comando:
|
0 |
npm install -g npm@11.6.2 |
Dovremmo visualizzare il seguente output:
|
0 1 2 3 |
removed 18 packages, and changed 117 packages in 3s 28 packages are looking for funding run `npm fund` for details |
CONFIGURAZIONE DELLE VARIABILI DI AMBIENTE
Copiare il file di esempio .env con il comando:
|
0 |
cp .env.example .env |
Quindi editarlo con il comando:
|
0 |
sudo nano .env |
Modificare i seguenti valori:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Server Configuration PORT=3000 # HTTP server port HTTPS_PORT=3443 # HTTPS server port # SSL/HTTPS Configuration ENABLE_HTTPS=true # Enable HTTPS server (true/false) SSL_DOMAIN=test.lab # Domain name for SSL certificate FORCE_HTTPS=true # Redirect HTTP to HTTPS (true/false) # Application Configuration NODE_ENV=prduction # Environment mode (development/production) CERT_DIR= # Custom certificate storage directory (optional) DEFAULT_THEME=dark # Default theme mode (dark/light) # Authentication Configuration ENABLE_AUTH=true # Enable user authentication (true/false) AUTH_USERNAME=admin # Username for authentication (when ENABLE_AUTH=true) AUTH_PASSWORD=PASSWORD # Password for authentication (when ENABLE_AUTH=true) |
Salvare e chiudere il file di configurazione
TEST CON ESECUZIONE INTERATTIVA
Avviare HTTP con il comando:
|
0 |
npm start |
In alternativa è possibile avviare HTTPS hot-reload per sviluppo con il comando:
|
0 |
npm run https-dev |
Per impostazione predefinita l’app ascolta su PORT=3000 (HTTP) e se ENABLE_HTTPS=true, su HTTPS_PORT=3443.
Dovremmo visualizzare il seguente output:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
> mkcert-web-ui@3.1.0 start > node server.js ℹ No settings.json found, using .env and defaults Warning: connect.session() MemoryStore is not designed for a production environment, as it will leak memory, and will not scale past a single process. HTTP server running on http://localhost:3000 (redirects to HTTPS) Generating SSL certificate for domain: npo-torino.lab... ✓ SSL certificate generated successfully Certificate: /opt/mkcertWeb/ssl/lab.test.pem Private Key: /opt/mkcertWeb/ssl/lab.test-key.pem HTTPS server running on https://localhost:3443 SSL Domain: npo-torino.lab Certificate storage: /opt/mkcertWeb/certificates Access the application at: https://localhost:3443 (HTTP requests will be redirected to HTTPS) |
ACCESSO A MKCERTWEB DA WEB GUI
A questo punto da un qualsiasi browser richiamare il link http://SERVER-MKCERTWEB:3000 oppure https://SERVER-MKCERTWEB:3443 e accedere con le credenziali definite precedentemente nel file .env
Cliccare Login
Se è andaton tutto a buon fine dovremmo visualizzare la Home di MKCertWEB
Da questa interfaccia è possibile eseguire le attività:
Generazione certificati
- Permette di generare certificati SSL/TLS per più domini e indirizzi IP.
- Possibilità di scegliere diversi formati in output: PEM, CRT, PFX (PKCS#12).
- Supporto per wildcard (ad es. *.dominio.local) e per più names nell’unica generazione.
Download dei certificati
Dopo la generazione, è possibile scaricare i file del certificato e della chiave direttamente tramite browser.
Gestione dei certificati esistenti
- Visualizzazione di tutti i certificati generati con informazioni quali nome soggetto, date di scadenza.
- Azioni come eliminazione (“delete”), archiviazione o ripristino dei certificati.
Autenticazione & Sicurezza
- Supporto per autenticazione di base (Basic Auth) + supporto per Single Sign-On via OpenID Connect (OIDC).
- Protezione contro iniezione di comandi, traversal di percorso, rate limiting multipli, sanitizzazione input.
Monitoraggio e notifiche
- Avvisi email automatici per certificati in scadenza, configurabili tramite SMTP.
- Sistema di monitoraggio interno che verifica periodicamente i certificati in scadenza e segnala secondo “warning days” e “critical days”.
Servizio SCEP (opzionale)
- Implementazione del protocollo SCEP (Simple Certificate Enrollment Protocol) per l’iscrizione automatica di dispositivi compatibili (iOS, macOS, Windows).
- Interfaccia /scep.html per gestire le operazioni SCEP.
API pubbliche
End point API per controllo stato sistema (GET /api/status), generazione di certificati (POST /api/generate), elenco certificati (GET /api/certificates), download file (GET /download/:filename) ecc.
Note utili
L’interfaccia supporta tema chiaro/scuro e design reattivo (responsive).
È fornito un container Docker / docker-compose già pronto.
Tutta la configurazione è tramite variabili ambiente (.env) per porta, autenticazione, SMTP, monitoraggio, ecc.
CREAZIONE DELL’UTENZA DI SERVIZIO
Il repository include un’unità di esempio mkcert-web-ui.service.
Copiarla e abilitarla con i seguenti comandi
Creare un utente dedicato non privilegiato con il comando:
|
0 |
sudo useradd -r -s /usr/sbin/nologin mkcertweb || true |
Creare la cartella mkcertweb con il comando:
|
0 |
sudo mkdir -p /var/lib/mkcertweb |
Assegnare i permessi con il comando:
|
0 |
sudo chown -R mkcertweb:mkcertweb /opt/mkcertWeb /var/lib/mkcertweb |
ESECUZIONE DI MKCERTWEB COME SERVIZIO SYSTEMD
Creare il file di servizio con il comando:
|
0 |
sudo nano /etc/systemd/system/mkcert-web-ui.service |
Incollare dentro il file il contenuto seguente:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
[Unit] Description=mkcert Web UI After=network.target [Service] Type=simple User=mkcertweb Group=mkcertweb PermissionsStartOnly=true # Directory del progetto WorkingDirectory=/opt/mkcertWeb # Carica eventuale .env (opzionale, se esiste) EnvironmentFile=-/opt/mkcertWeb/.env # PATH per trovare node e npm Environment=PATH=/usr/local/bin:/usr/bin:/bin # Crea cartelle necessarie prima dell'avvio (eseguite da root grazie a PermissionsStartOnly) ExecStartPre=/usr/bin/install -d -o mkcertweb -g mkcertweb /opt/mkcertWeb/certificates ExecStartPre=/usr/bin/install -d -o mkcertweb -g mkcertweb /opt/mkcertWeb/certificates/uploaded ExecStartPre=/usr/bin/install -d -o mkcertweb -g mkcertweb /opt/mkcertWeb/certificates/generated ExecStartPre=/usr/bin/install -d -o mkcertweb -g mkcertweb /opt/mkcertWeb/certificates/tmp ExecStartPre=/usr/bin/chown -R mkcertweb:mkcertweb /opt/mkcertWeb # Avvio (se preferisci: ExecStart=/usr/bin/node server.js) ExecStart=/usr/bin/node server.js Restart=always RestartSec=10 # Leggera protezione di sistema NoNewPrivileges=true ProtectSystem=full ProtectHome=true PrivateTmp=true [Install] WantedBy=multi-user.target |
Salvare e chiudere il file di configurazione
Ricaricare systemd e abilitare il servizio con i seguenti comandi:
|
0 1 2 3 4 |
sudo systemctl daemon-reload sudo systemctl enable mkcert-web-ui sudo systemctl start mkcert-web-ui |
Per verificare i log eseguire il comando:
|
0 |
journalctl -u mkcert-web-ui -n 80 --no-pager |
TIPS AND TRICKS
Se il file di configurazione .env non dovesse funzionare correttamente ripulirlo dei commenti con il seguente comando:
|
0 1 2 |
sudo sed -i 's/^[[:space:]]*PORT[[:space:]]*=.*/PORT=3001/' /opt/mkcertWeb/.env # rimuove commenti di fine riga in tutto il file (opzionale ma utile) sudo sed -i 's/[[:space:]]*#.*$//' /opt/mkcertWeb/.env |
CONSIDERAZIONI FINALI
✅ Pro di mkcertWeb
1. Interfaccia grafica intuitiva: mkcertWeb semplifica l’uso di mkcert fornendo una GUI fruibile via browser. Questo riduce la dipendenza dalla riga di comando ed è particolarmente utile per chi preferisce un approccio visuale.
2. Facilita la gestione dei certificati: Permette di generare, visualizzare ed esportare certificati in pochi clic, rendendo l’intero processo più rapido e organizzato, soprattutto su server remoti.
3. Accessibile da qualunque dispositivo: Essendo web-based, puoi accedere allo strumento da qualsiasi computer collegato alla rete interna, senza installare nulla in locale.
4. Ideale per team e ambienti condivisi: Più utenti possono connettersi allo stesso pannello web (protetto) e generare certificati evitando duplicazioni, errori o setup ripetuti.
5. Riduce la curva di apprendimento: mkcertWeb è utile per chi non ha familiarità con SSL/TLS, CA locali o mkcert stesso. L’interfaccia guida l’utente e riduce il rischio di comandi errati.
❌ Contro di mkcertWeb
1. Espone un’interfaccia web che va protetta: La presenza di un pannello web aumenta la superficie d’attacco. È necessario adottare contromisure (autenticazione, firewall, accesso limitato alla LAN) per evitare accessi non autorizzati.
2. Dipende da mkcert: mkcertWeb non funziona autonomamente: richiede mkcert installato e correttamente configurato sul server. È quindi un livello aggiuntivo da gestire.
3. Aggiornamenti e manutenzione aggiuntiva: Oltre a mkcert, occorre mantenere aggiornato anche mkcertWeb. In alcuni casi le versioni potrebbero non essere perfettamente allineate.
4. Non è pensato per ambienti di produzione: Come mkcert, anche mkcertWeb è progettato per sviluppo e testing. Non può sostituire CA professionali o certificazioni per domini pubblicamente raggiungibili.
5. Richiede attenzione ai permessi: Per gestire certificati e CA locali, l’applicazione ha bisogno di privilegi adeguati. Una configurazione non corretta potrebbe diventare un rischio di sicurezza.

0 commenti