Webmin permet d’administrer un serveur Linux depuis une interface web. C’est pratique, puissant, et donc à sécuriser sérieusement. Si vous laissez Webmin accessible avec un certificat auto-signé, un vieux TLS ou une configuration ouverte à tout Internet, vous transformez un outil d’administration en belle cible lumineuse.
L’objectif est simple : faire répondre Webmin en HTTPS avec un certificat TLS valide, idéalement Let’s Encrypt, puis limiter l’accès au strict nécessaire.
Webmin utilise son propre mini serveur web, appelé miniserv. Sa configuration principale se trouve généralement dans /etc/webmin/miniserv.conf. C’est là que Webmin sait quel certificat, quelle clé privée et quel port utiliser.
Avant de commencer : faut-il encore exposer Webmin publiquement ?
Avant de parler certificat, posons la vraie question : Webmin doit-il être accessible depuis tout Internet ?
Dans beaucoup de cas, la meilleure configuration est :
- Webmin écoute en HTTPS ;
- le port
10000est filtré par firewall ; - seules vos IPs d’administration peuvent se connecter ;
- l’authentification à deux facteurs est activée ;
- Webmin est mis à jour régulièrement ;
- l’accès root direct est évité si possible.
Un certificat TLS protège la connexion. Il ne remplace pas une vraie politique d’accès. Une porte blindée reste une porte ouverte si vous laissez la poignée dans la rue.
Vérifier que Webmin fonctionne déjà
Commencez par vérifier l’état du service :
sudo systemctl status webmin --no-pager
Regardez ensuite sur quel port Webmin écoute :
sudo grep -E '^(port|listen|ssl|keyfile|certfile)=' /etc/webmin/miniserv.confCode language: JavaScript (javascript)
Par défaut, Webmin écoute souvent sur le port 10000. Testez localement :
curl -kI https://localhost:10000/Code language: JavaScript (javascript)
Depuis une autre machine, remplacez par votre nom d’hôte :
curl -kI https://admin.example.com:10000/Code language: JavaScript (javascript)
L’option -k ignore temporairement l’erreur de certificat. Elle sert au diagnostic, pas à valider la sécurité.
Choisir le bon nom d’hôte
Un certificat TLS doit correspondre au nom utilisé dans le navigateur. Évitez d’accéder à Webmin avec l’adresse IP si vous voulez un certificat public valide.
Utilisez plutôt un sous-domaine dédié :
admin.example.com
panel.example.com
webmin.example.comCode language: CSS (css)
Créez un enregistrement DNS A ou AAAA vers le serveur :
admin.example.com. 3600 IN A 203.0.113.10
admin.example.com. 3600 IN AAAA 2001:db8::10Code language: CSS (css)
Vérifiez la résolution DNS :
dig +short admin.example.com A
dig +short admin.example.com AAAACode language: CSS (css)
Le nom d’hôte doit pointer vers le bon serveur avant de demander un certificat Let’s Encrypt.
Méthode 1 : utiliser Let’s Encrypt depuis Webmin
La méthode la plus simple consiste à demander un certificat Let’s Encrypt depuis l’interface Webmin, si votre installation le permet.
- Connectez-vous à Webmin.
- Allez dans Webmin → Webmin Configuration.
- Ouvrez SSL Encryption.
- Allez dans l’onglet Let’s Encrypt.
- Indiquez le nom d’hôte, par exemple
admin.example.com. - Définissez un renouvellement automatique, par exemple tous les 1 ou 2 mois.
- Cliquez sur Request Certificate.
Cette méthode est propre si Webmin peut valider le domaine. Selon votre configuration, la validation Let’s Encrypt peut dépendre du port 80, d’un répertoire web accessible, ou de la configuration Apache/nginx détectée par Webmin.
Si la demande échoue, ne forcez pas. Lisez le message d’erreur : DNS incorrect, port 80 bloqué, challenge inaccessible, proxy Cloudflare mal réglé, ou nom d’hôte qui ne pointe pas sur le serveur. Let’s Encrypt est gratuit, pas devin.
Méthode 2 : utiliser un certificat Let’s Encrypt déjà existant
Si vous utilisez déjà Let’s Encrypt avec certbot, vous avez probablement des fichiers comme :
/etc/letsencrypt/live/admin.example.com/fullchain.pem
/etc/letsencrypt/live/admin.example.com/privkey.pem
Vérifiez qu’ils existent :
sudo ls -l /etc/letsencrypt/live/admin.example.com/
Webmin peut utiliser un fichier PEM qui contient la clé privée et la chaîne de certificats. Créez un fichier dédié dans /etc/webmin :
sudo install -m 0600 -o root -g root /dev/null /etc/webmin/miniserv-letsencrypt.pem
sudo sh -c 'cat \
/etc/letsencrypt/live/admin.example.com/privkey.pem \
/etc/letsencrypt/live/admin.example.com/fullchain.pem \
> /etc/webmin/miniserv-letsencrypt.pem'Code language: JavaScript (javascript)
Vérifiez les permissions :
Vos sauvegardes sont-elles vraiment fiables ?
Une sauvegarde que vous n'avez jamais testée n'est pas une sauvegarde — c'est une illusion de sécurité. Je mets en place des backups automatisés, hors-site, vérifiés, avec procédure de restauration documentée.
Mettons en place une vraie stratégie de backup →sudo chown root:root /etc/webmin/miniserv-letsencrypt.pem
sudo chmod 0600 /etc/webmin/miniserv-letsencrypt.pem
Ensuite, éditez la configuration Webmin :
sudo nano /etc/webmin/miniserv.conf
Vérifiez que SSL est actif :
ssl=1
Puis définissez le fichier PEM :
keyfile=/etc/webmin/miniserv-letsencrypt.pemCode language: JavaScript (javascript)
Selon la version de Webmin, vous pouvez aussi trouver ou utiliser des directives séparées comme certfile. Si votre installation les utilise déjà, ne mélangez pas les méthodes. Gardez une configuration claire et testée.
Redémarrez Webmin :
sudo systemctl restart webmin
Sur de vieilles installations, la commande peut être :
sudo service webmin restart
Automatiser le déploiement après renouvellement certbot
Let’s Encrypt renouvelle les certificats régulièrement. Si Webmin utilise une copie PEM dans /etc/webmin, il faut la recréer après chaque renouvellement.
Créez un hook de déploiement Certbot :
sudo nano /etc/letsencrypt/renewal-hooks/deploy/webmin-cert.sh
Ajoutez :
#!/usr/bin/env bash
set -euo pipefail
DOMAIN="admin.example.com"
WEBMIN_PEM="/etc/webmin/miniserv-letsencrypt.pem"
LIVE_DIR="/etc/letsencrypt/live/${DOMAIN}"
cat "${LIVE_DIR}/privkey.pem" "${LIVE_DIR}/fullchain.pem" > "${WEBMIN_PEM}"
chown root:root "${WEBMIN_PEM}"
chmod 0600 "${WEBMIN_PEM}"
systemctl restart webminCode language: PHP (php)
Rendez le script exécutable :
sudo chmod 0750 /etc/letsencrypt/renewal-hooks/deploy/webmin-cert.sh
Testez un renouvellement à blanc :
sudo certbot renew --dry-run
Si le hook fonctionne, Webmin utilisera automatiquement le certificat renouvelé. Sinon, vous aurez un certificat valide côté nginx, mais Webmin continuera avec l’ancien fichier. Ce genre de détail adore expirer à 2 h du matin.
Méthode 3 : utiliser acme.sh pour générer le certificat Webmin
Si vous utilisez acme.sh, vous pouvez déployer un certificat directement pour Webmin.
Exemple avec un certificat déjà émis pour admin.example.com :
acme.sh --install-cert -d admin.example.com \
--key-file /etc/webmin/admin.example.com.key \
--fullchain-file /etc/webmin/admin.example.com.fullchain.pem \
--reloadcmd "cat /etc/webmin/admin.example.com.key /etc/webmin/admin.example.com.fullchain.pem > /etc/webmin/miniserv-letsencrypt.pem && chmod 600 /etc/webmin/miniserv-letsencrypt.pem && systemctl restart webmin"Code language: JavaScript (javascript)
Vérifiez ensuite que /etc/webmin/miniserv.conf pointe vers :
keyfile=/etc/webmin/miniserv-letsencrypt.pemCode language: JavaScript (javascript)
Cette méthode est pratique si votre serveur utilise déjà acme.sh pour nginx, Postfix, Dovecot ou d’autres services. Gardez simplement des permissions strictes : les clés privées ne doivent pas être lisibles par tout le monde.
Méthode 4 : utiliser un certificat commercial ou interne
Si vous disposez d’un certificat commercial ou d’un certificat interne, Webmin peut aussi l’utiliser. Vous aurez généralement :
- une clé privée ;
- un certificat serveur ;
- un ou plusieurs certificats intermédiaires.
Créez un fichier PEM dans cet ordre :
sudo sh -c 'cat \
/chemin/vers/private.key \
/chemin/vers/certificate.crt \
/chemin/vers/intermediate.crt \
> /etc/webmin/miniserv-custom.pem'
sudo chown root:root /etc/webmin/miniserv-custom.pem
sudo chmod 0600 /etc/webmin/miniserv-custom.pemCode language: JavaScript (javascript)
Puis configurez Webmin :
ssl=1
keyfile=/etc/webmin/miniserv-custom.pemCode language: JavaScript (javascript)
Redémarrez :
sudo systemctl restart webmin
Si le navigateur signale une chaîne incomplète, vérifiez que vous avez bien inclus les certificats intermédiaires. Un certificat seul ne suffit pas toujours.
Tester le certificat Webmin avec OpenSSL
Après redémarrage, testez la connexion TLS :
openssl s_client -connect admin.example.com:10000 -servername admin.example.comCode language: CSS (css)
Vérifiez notamment :
Verify return code: 0 (ok)Code language: JavaScript (javascript)
Affichez directement les dates du certificat servi :
echo | openssl s_client -connect admin.example.com:10000 -servername admin.example.com 2>/dev/null \
| openssl x509 -noout -subject -issuer -datesCode language: JavaScript (javascript)
Vous devez retrouver le bon nom d’hôte, le bon émetteur et une date d’expiration cohérente.
Tester depuis le navigateur
Ouvrez Webmin avec le nom d’hôte exact du certificat :
https://admin.example.com:10000/Code language: JavaScript (javascript)
Le cadenas doit être valide. Si vous accédez à Webmin avec l’adresse IP, le navigateur affichera probablement une erreur de nom. C’est normal : le certificat est émis pour admin.example.com, pas pour 203.0.113.10.
Si le navigateur affiche encore l’ancien certificat, testez en navigation privée, videz le cache HSTS si nécessaire, puis revérifiez avec openssl s_client. OpenSSL ne ment pas par nostalgie du cache navigateur.
Ouvrir ou limiter le port 10000
Webmin écoute souvent sur le port 10000. Vérifiez l’écoute réseau :
sudo ss -ltnp | grep ':10000'Code language: JavaScript (javascript)
Si vous utilisez UFW et voulez autoriser temporairement votre IP uniquement :
sudo ufw allow from 198.51.100.25 to any port 10000 proto tcpCode language: CSS (css)
Remplacez 198.51.100.25 par votre adresse IP publique.
Avec nftables, une règle peut ressembler à ceci selon votre table existante :
sudo nft add rule inet filter input ip saddr 198.51.100.25 tcp dport 10000 acceptCode language: CSS (css)
Adaptez à votre configuration nftables réelle. Ne collez pas une règle firewall sans savoir dans quelle table et quelle chaîne vous travaillez.
Limiter l’accès depuis Webmin lui-même
Webmin peut aussi limiter les adresses IP autorisées. Dans l’interface :
- Allez dans Webmin → Webmin Configuration.
- Ouvrez IP Access Control.
- Autorisez uniquement vos IPs ou votre plage VPN.
- Enregistrez.
Je préfère faire le filtrage au niveau firewall, puis garder Webmin comme couche secondaire. Deux verrous valent mieux qu’une promesse d’interface.
Activer l’authentification à deux facteurs
Si Webmin est accessible à distance, activez l’authentification à deux facteurs. Dans Webmin, cherchez les options liées à Two-Factor Authentication ou à la sécurité des utilisateurs Webmin selon votre version.
Le TLS protège la connexion. Le 2FA protège mieux le compte si un mot de passe fuit. Les deux ne font pas le même travail.
Faut-il mettre Webmin derrière nginx ou Apache ?
Vous pouvez placer Webmin derrière un reverse proxy nginx ou Apache, par exemple pour accéder à :
https://admin.example.com/Code language: JavaScript (javascript)
au lieu de :
https://admin.example.com:10000/Code language: JavaScript (javascript)
Cela peut être pratique si vous voulez centraliser TLS, filtrer les IPs, ajouter une authentification externe ou éviter d’exposer le port 10000.
Mais ce n’est pas obligatoire. Webmin sait servir HTTPS directement. Si vous ajoutez un reverse proxy, testez soigneusement les redirections, WebSocket éventuels, chemins, en-têtes proxy et restrictions IP. Une couche de plus peut sécuriser. Elle peut aussi casser proprement ce qui marchait très bien.
Exemple nginx en reverse proxy pour Webmin
Voici une base nginx si vous voulez servir Webmin derrière https://admin.example.com/. Dans ce cas, Webmin peut rester accessible seulement en local sur 127.0.0.1:10000, selon votre configuration.
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name admin.example.com;
ssl_certificate /etc/letsencrypt/live/admin.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/admin.example.com/privkey.pem;
location / {
proxy_pass https://127.0.0.1:10000/;
proxy_ssl_verify off;
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 https;
}
}Code language: PHP (php)
Testez nginx :
sudo nginx -t
sudo systemctl reload nginx
Cette configuration est volontairement minimale. Sur un serveur réel, ajoutez vos restrictions IP, durcissements TLS, logs dédiés et règles de sécurité habituelles.
Changer le port Webmin si nécessaire
Le port par défaut de Webmin est souvent 10000. Vous pouvez le changer dans /etc/webmin/miniserv.conf :
port=10000
listen=10000
Par exemple :
port=10443
listen=10443
Redémarrez Webmin :
sudo systemctl restart webmin
Puis adaptez le firewall. Changer le port réduit un peu le bruit des scans opportunistes, mais ce n’est pas une vraie mesure de sécurité. Le firewall, les mises à jour et le 2FA comptent davantage.
Vérifier les logs Webmin
Si Webmin ne redémarre pas après changement du certificat, commencez par les logs systemd :
sudo journalctl -u webmin -n 100 --no-pager
Webmin possède aussi ses propres logs, souvent dans :
/var/webmin/miniserv.error
/var/webmin/miniserv.logCode language: JavaScript (javascript)
Consultez les dernières lignes :
sudo tail -n 100 /var/webmin/miniserv.error
sudo tail -n 100 /var/webmin/miniserv.logCode language: JavaScript (javascript)
Les erreurs fréquentes concernent les permissions de la clé privée, un fichier PEM mal formé, un chemin incorrect, ou un certificat sans chaîne complète.
Erreurs fréquentes
Le navigateur affiche toujours un certificat auto-signé
Webmin sert probablement encore l’ancien fichier miniserv.pem. Vérifiez keyfile dans /etc/webmin/miniserv.conf, puis redémarrez Webmin.
sudo grep '^keyfile=' /etc/webmin/miniserv.conf
sudo systemctl restart webminCode language: JavaScript (javascript)
Webmin ne redémarre plus après changement du certificat
Le fichier PEM est peut-être mal formé ou illisible. Vérifiez la syntaxe du certificat :
sudo openssl x509 -in /etc/webmin/miniserv-letsencrypt.pem -noout -subject -issuer -dates
Vérifiez les permissions :
sudo ls -l /etc/webmin/miniserv-letsencrypt.pem
Puis lisez les logs :
sudo journalctl -u webmin -n 100 --no-pager
Let’s Encrypt refuse de générer le certificat
Vérifiez que le DNS pointe vers le serveur, que le port 80 est joignable si vous utilisez un challenge HTTP, et que Cloudflare ou un autre proxy ne bloque pas la validation.
dig +short admin.example.com
curl -I http://admin.example.com/Code language: JavaScript (javascript)
OpenSSL signale une chaîne incomplète
Utilisez fullchain.pem, pas seulement cert.pem. Le fichier servi par Webmin doit inclure le certificat serveur et les intermédiaires.
Le certificat se renouvelle, mais Webmin garde l’ancien
Vous avez probablement copié le certificat une seule fois dans /etc/webmin. Ajoutez un hook de renouvellement Certbot ou une commande acme.sh --install-cert pour régénérer le PEM et redémarrer Webmin automatiquement.
Durcir Webmin après activation TLS
Une fois HTTPS fonctionnel, durcissez l’accès. Voici les priorités :
- mettre Webmin à jour ;
- limiter le port Webmin aux IPs d’administration ;
- activer l’authentification à deux facteurs ;
- désactiver les comptes inutiles ;
- éviter les mots de passe faibles ;
- surveiller les logs de connexion ;
- ne pas exposer Webmin si un VPN suffit ;
- ne pas réutiliser le mot de passe root ailleurs.
Un Webmin proprement chiffré mais ouvert à tout Internet reste un panneau d’administration exposé. TLS évite l’écoute. Il ne remplace pas la réduction de surface d’attaque.
Commandes utiles de diagnostic
# État du service.
sudo systemctl status webmin --no-pager
# Logs récents.
sudo journalctl -u webmin -n 100 --no-pager
# Configuration TLS Webmin.
sudo grep -E '^(ssl|keyfile|certfile|extracas|port|listen)=' /etc/webmin/miniserv.conf
# Port Webmin.
sudo ss -ltnp | grep ':10000'
# Test HTTP local.
curl -kI https://localhost:10000/
# Test TLS distant.
openssl s_client -connect admin.example.com:10000 -servername admin.example.com
# Certificat réellement servi.
echo | openssl s_client -connect admin.example.com:10000 -servername admin.example.com 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
# Permissions du PEM Webmin.
sudo ls -l /etc/webmin/*.pem
# Logs miniserv.
sudo tail -n 100 /var/webmin/miniserv.errorCode language: PHP (php)
Checklist de configuration Webmin TLS
- Créer un sous-domaine dédié, par exemple
admin.example.com. - Faire pointer le DNS vers le serveur.
- Vérifier que Webmin fonctionne sur le port
10000. - Choisir entre Let’s Encrypt intégré, Certbot, acme.sh ou certificat existant.
- Utiliser
fullchain.pemetprivkey.pemsi vous passez par Let’s Encrypt. - Créer un PEM dédié à Webmin si nécessaire.
- Mettre des permissions strictes sur la clé privée ou le PEM.
- Configurer
ssl=1etkeyfiledansminiserv.conf. - Redémarrer Webmin.
- Tester avec
openssl s_client. - Automatiser le renouvellement du certificat.
- Limiter l’accès au port Webmin par firewall.
- Activer le 2FA si Webmin reste accessible à distance.
- Surveiller les logs Webmin après changement.
Besoin d’aide pour sécuriser Webmin ou votre serveur dédié ?
Besoin d’un administrateur système pour sécuriser votre serveur ?
Si Webmin affiche encore un certificat auto-signé, si Let’s Encrypt ne se renouvelle pas, ou si votre panneau d’administration est exposé trop largement, je peux vous aider à remettre la configuration au propre.
J’interviens sur les serveurs Linux, Debian, Ubuntu, nginx, Apache, Webmin, WordPress et WooCommerce pour sécuriser TLS, automatiser les certificats, corriger les services systemd, limiter les accès et documenter la configuration.
- Configuration Webmin HTTPS, Let’s Encrypt, Certbot ou acme.sh.
- Durcissement firewall, accès IP, VPN, 2FA et comptes administrateur.
- Correction des certificats expirés, chaînes incomplètes et renouvellements cassés.
- Audit serveur Linux, nginx, Apache, PHP-FPM, Postfix, Dovecot et WordPress.
- Intervention propre, testée et documentée.
Vous voulez éviter qu’un panneau d’administration devienne votre plus gros point faible ? Contactez-moi. Je vous aiderai à sécuriser Webmin et le reste du serveur proprement.
FAQ : Webmin, TLS et certificat SSL
Webmin utilise-t-il Apache ou nginx pour HTTPS ?
Pas par défaut. Webmin utilise son propre serveur web, miniserv. Sa configuration TLS se trouve généralement dans /etc/webmin/miniserv.conf.
Quel fichier certificat faut-il donner à Webmin ?
Selon la configuration, Webmin peut utiliser un fichier PEM contenant la clé privée et la chaîne de certificats. Avec Let’s Encrypt, concaténez généralement privkey.pem puis fullchain.pem dans un fichier dédié à Webmin.
Pourquoi utiliser fullchain.pem plutôt que cert.pem ?
fullchain.pem contient le certificat serveur et les certificats intermédiaires. Sans chaîne complète, certains navigateurs ou clients TLS peuvent signaler un certificat incomplet ou non fiable.
Comment renouveler automatiquement le certificat Webmin ?
Si Webmin utilise une copie PEM, ajoutez un hook Certbot ou une commande acme.sh --install-cert qui régénère le PEM et redémarre Webmin après chaque renouvellement.
Faut-il laisser le port 10000 ouvert publiquement ?
Je le déconseille. Limitez le port 10000 à vos IPs d’administration, à un VPN, ou placez Webmin derrière un reverse proxy bien filtré. TLS ne remplace pas le contrôle d’accès.
Comment tester le certificat réellement servi par Webmin ?
Utilisez openssl s_client -connect admin.example.com:10000 -servername admin.example.com, puis vérifiez le sujet, l’émetteur, les dates et le code de vérification.
Sources
- Webmin : Using SSL with Webmin
- Let’s Encrypt : documentation officielle
- Time4VPS : installer un certificat Let’s Encrypt dans Webmin
- Virtualmin Forum : Let’s Encrypt for Webmin user interface
- SkyMinds : solution pour Webmin qui ne veut pas démarrer sous systemd
- SkyMinds : mettre à jour OpenSSL pour TLS 1.3
- SkyMinds : redémarrer les services qui utilisent libssl/OpenSSL
- SkyMinds : ajouter un domaine à la liste HSTS preload
- SkyMinds : configurer le WebUI Transmission en HTTPS
Vos sauvegardes sont-elles vraiment fiables ?
Une sauvegarde que vous n'avez jamais testée n'est pas une sauvegarde — c'est une illusion de sécurité. Je mets en place des backups automatisés, hors-site, vérifiés, avec procédure de restauration documentée.
Mettons en place une vraie stratégie de backup →
