
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