Configurer Webmin en HTTPS avec un certificat TLS

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 10000 est 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.

  1. Connectez-vous à Webmin.
  2. Allez dans Webmin → Webmin Configuration.
  3. Ouvrez SSL Encryption.
  4. Allez dans l’onglet Let’s Encrypt.
  5. Indiquez le nom d’hôte, par exemple admin.example.com.
  6. Définissez un renouvellement automatique, par exemple tous les 1 ou 2 mois.
  7. 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 :

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.

Distingo, le livret à 2%

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 :

  1. Allez dans Webmin → Webmin Configuration.
  2. Ouvrez IP Access Control.
  3. Autorisez uniquement vos IPs ou votre plage VPN.
  4. 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.pem et privkey.pem si 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=1 et keyfile dans miniserv.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

Demandez à l'IA son opinion
Gravatar for Matt Biscay

Je suis Matt Biscay, développeur WordPress & WooCommerce certifié chez Codeable, administrateur système et enseignant.

J’aide les entreprises à créer, optimiser et fiabiliser leurs sites WordPress avec une approche technique propre : performance, sécurité, maintenance, développement sur mesure et résolution de problèmes complexes.

Sur Skyminds, je partage des tutoriels WordPress, WooCommerce, Linux et administration système, avec des solutions testées sur des cas réels et pensées pour durer.

Découvrez mes services WordPress et WooCommerce.

Opinions