Retour au blog
réseau25 min de lecture10 juin 2026

XMPP en 2026 : messagerie décentralisée, chiffrée et fédérée — Guide complet

Installation de Prosody, configuration TLS, OMEMO E2E, salons MUC, fédération mondiale, clients recommandés et cas d'usage avancés (IoT, alertes serveur). Le guide XMPP le plus complet du web.

XMPP (Extensible Messaging and Presence Protocol) est un protocole de messagerie ouvert, décentralisé et fédéré, qui tourne sur internet depuis 1999 — bien avant Signal, WhatsApp ou Telegram. Là où ces applications sont des silos fermés contrôlés par une entreprise, XMPP est un standard : n'importe qui peut héberger son propre serveur, chiffrer ses communications avec OMEMO, et envoyer des messages à n'importe quel autre serveur XMPP dans le monde, exactement comme l'email. Ce guide couvre tout : installation de Prosody, configuration TLS, modules essentiels, chiffrement OMEMO, fédération, clients recommandés, et dépannage.

Pourquoi XMPP en 2026 ?

La question revient souvent : "XMPP n'est-il pas mort ?" La réponse courte : non. La réponse longue mérite qu'on s'y attarde.

  • WhatsApp, Signal, Telegram, Discord — tous ces services peuvent disparaître, être rachetés, être censurés, ou décider de changer leurs conditions un matin. XMPP est un protocole, pas une application : il ne peut pas être "fermé".
  • Fédération : ton serveur XMPP peut contacter n'importe quel autre serveur XMPP dans le monde. Ton compte azuka@ton-serveur.fr peut écrire à quelqu'un sur mojeserver.cz ou jabber.org.
  • Décentralisation réelle : personne ne détient "XMPP". Pas de metadata centralisée, pas de graphe social global, pas d'entreprise qui monétise tes données.
  • OMEMO (basé sur le Signal Protocol) offre un chiffrement de bout en bout avec Perfect Forward Secrecy, multi-appareils, et multi-destinataires — au même niveau que Signal.
  • XMPP propulse aujourd'hui WhatsApp (leur infra interne), Google Chat (historiquement), la majorité des jeux en ligne (Xbox Live, PlayStation Network, EVE Online), l'IoT industriel, et des millions d'installations d'entreprises.

XMPP ne remplace pas Signal pour le grand public — l'expérience utilisateur est plus complexe. XMPP brille pour : hébergement auto, communications d'équipe souveraines, intégration technique, notifications serveur, et toute situation où vous ne voulez pas dépendre d'un tiers.

Architecture XMPP : comment ça fonctionne

Le JID — votre identité XMPP

Votre identifiant XMPP s'appelle un JID (Jabber ID). Il ressemble à une adresse email :

bash
# Format complet (bare JID) :
azuka@xytherion.online

# JID complet avec ressource (full JID) — identifie un appareil spécifique :
azuka@xytherion.online/laptop
azuka@xytherion.online/phone

# JID d'un salon de discussion (MUC) :
general@conference.xytherion.online

# Chaque connexion d'un même compte sur des appareils différents = ressource différente
# Les messages sont livrés à TOUTES les ressources connectées (ou la plus prioritaire)

Fédération : le modèle email appliqué à la messagerie

XMPP fonctionne exactement comme l'email au niveau transport. Quand azuka@monserveur.fr envoie un message à alice@autreserveur.com :

  1. 1Le client XMPP d'azuka envoie le message à monserveur.fr (connexion TLS client→serveur, port 5222)
  2. 2monserveur.fr résout le SRV record DNS de autreserveur.com
  3. 3monserveur.fr établit une connexion TLS serveur→serveur avec autreserveur.com (port 5269)
  4. 4Le message est livré — aucun serveur central n'est impliqué
bash
# DNS SRV records XMPP (à configurer chez votre registrar)
# Client → Serveur (c2s) :
_xmpp-client._tcp.xytherion.online.  IN SRV  5 0 5222 xytherion.online.

# Serveur → Serveur (s2s) :
_xmpp-server._tcp.xytherion.online.  IN SRV  5 0 5269 xytherion.online.

# XMPP over HTTPS (BOSH/WebSocket pour clients web) :
_xmppconnect.xytherion.online.  IN TXT  "_xmpp-client-xbosh=https://xytherion.online/http-bind"

# Vérifier les records existants
dig SRV _xmpp-client._tcp.xytherion.online
dig SRV _xmpp-server._tcp.xytherion.online

Choisir son serveur XMPP

Trois implémentations dominent en 2026 :

  • Prosody (Lua) — léger, modulaire, excellente documentation, recommandé pour hébergement perso et PME. C'est ce guide.
  • ejabberd (Erlang) — massivement scalable (WhatsApp en dérivait), utilisé pour des millions d'utilisateurs. Configuration plus complexe.
  • Openfire (Java) — interface web d'administration intégrée, populaire en entreprise Windows. Plus lourd.

Pour un VPS personnel ou une petite équipe (< 1000 utilisateurs), Prosody est le meilleur choix. Sa config en Lua est lisible, ses modules sont excellents, et sa mémoire au repos est de l'ordre de 20-50 MB.

Installation de Prosody sur Debian/Ubuntu

bash
# Ajouter le dépôt officiel Prosody (versions plus récentes que Debian stable)
echo "deb https://packages.prosody.im/debian $(lsb_release -cs) main"   | tee /etc/apt/sources.list.d/prosody.list

# Importer la clé GPG
curl -fsSL https://prosody.im/files/prosody-debian-packages.key   | gpg --dearmor | tee /etc/apt/trusted.gpg.d/prosody.gpg > /dev/null

apt update && apt install -y prosody

# Vérifier la version
prosodyctl about
# Prosody 0.12.x "Hermit Thrush"

# Statut
systemctl status prosody

# Structure des fichiers importants
ls /etc/prosody/
# prosody.cfg.lua      ← fichier de configuration principal
# certs/               ← certificats SSL (symlinks depuis Let's Encrypt)
# conf.d/              ← configurations supplémentaires (VirtualHosts)

Configuration de Prosody (prosody.cfg.lua)

Le fichier /etc/prosody/prosody.cfg.lua contrôle tout. Voici une configuration complète et sécurisée pour un serveur de production.

bash
cp /etc/prosody/prosody.cfg.lua /etc/prosody/prosody.cfg.lua.bak
nano /etc/prosody/prosody.cfg.lua
ini
---------- Prosody Configuration — Production Ready ----------
-- Remplacez "xytherion.online" par votre domaine partout

-- Processus
pidfile = "/run/prosody/prosody.pid"

-- Modules activés globalement
modules_enabled = {
    -- Essentiels
    "roster";          -- Liste de contacts
    "saslauth";        -- Authentification SASL
    "tls";             -- Chiffrement TLS
    "dialback";        -- Vérification serveur-serveur
    "disco";           -- Découverte de services
    "carbons";         -- Sync messages multi-appareils (XEP-0280)
    "smacks";          -- Stream Management / reconnexion (XEP-0198)
    "csi_simple";      -- Client State Indication / batterie (XEP-0352)

    -- Présence et contacts
    "presence";        -- Gestion de présence
    "private";         -- Stockage privé XML
    "vcard4";          -- Cartes de contact vCard4
    "blocklist";       -- Liste noire (XEP-0191)

    -- Messages
    "mam";             -- Message Archive Management (XEP-0313) historique
    "ping";            -- XMPP Ping (XEP-0199)

    -- Transfert de fichiers
    "http_upload";     -- Upload de fichiers via HTTP (XEP-0363)

    -- Administration
    "admin_adhoc";     -- Commandes d'administration
    "motd";            -- Message du jour
    "announce";        -- Annonces globales

    -- Sécurité
    "limits";          -- Limitation de débit
    "s2s_bidi";        -- Connexions bidirectionnelles s2s (XEP-0288)
    "watchregistrations"; -- Surveiller les nouvelles inscriptions
};

-- Modules désactivés
modules_disabled = {};

-- Stockage des données
data_path = "/var/lib/prosody"
default_storage = "internal"

-- Stockage Message Archive Management
storage = {
    archive = "internal";
    archive2 = "internal";
}

-- MAM : garder l'historique 3 mois
archive_expires_after = "3m"

-- Authentification
authentication = "internal_hashed"    -- Mots de passe hashés (bcrypt)

-- TLS — désactiver les protocoles faibles
ssl = {
    protocol = "tlsv1_2+";            -- TLS 1.2 minimum
    ciphers = "ECDHE+AESGCM:ECDHE+CHACHA20:!aNULL:!eNULL:!EXPORT";
    options = { "no_sslv2"; "no_sslv3"; "no_tlsv1"; "no_tlsv1_1"; "cipher_server_preference" };
    dhparam = "/etc/prosody/certs/dh2048.pem";  -- Voir ci-dessous
}

-- Forcer TLS pour toutes les connexions
c2s_require_encryption = true    -- Clients → Serveur
s2s_require_encryption = true    -- Serveur → Serveur
s2s_secure_auth = false          -- true = rejeter les s2s non-vérifiés (strict)

-- Ports
c2s_ports = { 5222 }             -- Client → Serveur
s2s_ports = { 5269 }             -- Serveur → Serveur
legacy_ssl_ports = { 5223 }      -- SSL legacy (optionnel)

-- HTTP pour BOSH/WebSocket et upload de fichiers
http_ports = { 5280 }
http_interfaces = { "127.0.0.1" }    -- Exposer via reverse proxy Apache/Nginx
https_ports = {}                     -- Apache/Nginx gère le TLS HTTP

-- Inscription : désactivée par défaut (créer les comptes manuellement)
allow_registration = false

-- Rate limiting pour éviter le spam
limits = {
    c2s = {
        rate = "10kb/s";
        burst = "30kb/s";
    };
    s2s = {
        rate = "30kb/s";
        burst = "100kb/s";
    };
}

-- Logs
log = {
    info = "/var/log/prosody/prosody.log";
    error = "/var/log/prosody/prosody.err";
    -- debug = "/var/log/prosody/prosody_debug.log";  -- Activer si besoin
}

----------- VirtualHosts -----------
VirtualHost "xytherion.online"
    -- Certificats Let's Encrypt (prosodyctl --root cert import après renouvellement)
    ssl = {
        certificate = "/etc/letsencrypt/live/xytherion.online/fullchain.pem";
        key = "/etc/letsencrypt/live/xytherion.online/privkey.pem";
    }

----------- Composants -----------
-- Salon de discussion multi-utilisateurs (MUC — Multi-User Chat)
Component "conference.xytherion.online" "muc"
    name = "Salons Xytherion"
    restrict_room_creation = "local"    -- Seuls les utilisateurs locaux créent des salons
    muc_log_all_rooms = true            -- Archiver tous les salons
    max_history_messages = 100          -- Messages récupérés à la connexion

    modules_enabled = {
        "muc_mam";              -- Archive des salons
        "muc_occupant_id";      -- ID anonyme (XEP-0421)
    }

-- Serveur de proxy SOCKS5 pour le transfert de fichiers pair-à-pair
Component "proxy.xytherion.online" "proxy65"
    proxy65_address = "xytherion.online"
    proxy65_acl = { "xytherion.online" }

-- PubSub (notifications push, IoT)
Component "pubsub.xytherion.online" "pubsub"
    unrestricted_node_creation = false

Certificats TLS avec Let's Encrypt

bash
# Installer Certbot si pas déjà fait
apt install -y certbot

# Obtenir le certificat (mode standalone — arrêter Apache/Nginx temporairement si nécessaire)
certbot certonly --standalone -d xytherion.online   -d conference.xytherion.online   -d proxy.xytherion.online   -d pubsub.xytherion.online

# Ou avec Apache/Nginx actif :
certbot certonly --webroot -w /var/www/html   -d xytherion.online   -d conference.xytherion.online

# Générer les paramètres DH (une seule fois, peut prendre quelques minutes)
openssl dhparam -out /etc/prosody/certs/dh2048.pem 2048

# Importer les certificats dans Prosody
prosodyctl --root cert import /etc/letsencrypt/live/

# Vérifier que Prosody a accès aux certificats
ls -la /etc/prosody/certs/

# Hook de renouvellement automatique (post-hook Certbot)
cat > /etc/letsencrypt/renewal-hooks/deploy/prosody.sh << 'EOF'
#!/bin/bash
prosodyctl --root cert import /etc/letsencrypt/live/
systemctl reload prosody
EOF
chmod +x /etc/letsencrypt/renewal-hooks/deploy/prosody.sh

Démarrer Prosody et créer les utilisateurs

bash
# Vérifier la configuration
prosodyctl check config
# Affiche les erreurs et avertissements de configuration

# Vérifier les certificats
prosodyctl check certs

# Démarrer Prosody
systemctl start prosody
systemctl enable prosody

# Créer un compte utilisateur
prosodyctl adduser azuka@xytherion.online
# Password: ••••••••

# Changer le mot de passe
prosodyctl passwd azuka@xytherion.online

# Supprimer un compte
prosodyctl deluser azuka@xytherion.online

# Lister les utilisateurs
prosodyctl mod_admin_adhoc    # Via interface admin

# Voir les connexions en cours
prosodyctl status

# Voir les logs en temps réel
journalctl -u prosody -f
tail -f /var/log/prosody/prosody.log

Configurer le pare-feu

bash
# Ports XMPP à ouvrir dans UFW
ufw allow 5222/tcp comment "XMPP client-to-server (c2s)"
ufw allow 5269/tcp comment "XMPP server-to-server (s2s)"
ufw allow 5223/tcp comment "XMPP legacy SSL (optionnel)"

# Port proxy65 (transfert de fichiers P2P)
ufw allow 5000/tcp comment "XMPP proxy65 file transfer"

# HTTP/HTTPS pour BOSH, WebSocket et upload (géré par Apache/Nginx)
# Déjà ouvert si vous avez un site web

# Port 5280/5281 : NE PAS ouvrir depuis l'extérieur
# Prosody HTTP est sur 127.0.0.1 — Apache proxifie vers lui

ufw reload
ufw status numbered

Reverse proxy Apache pour BOSH et WebSocket

BOSH et WebSocket permettent aux clients web (Converse.js, etc.) de se connecter via HTTPS. Prosody écoute sur 127.0.0.1:5280, Apache proxifie.

bash
a2enmod proxy proxy_http proxy_wstunnel headers rewrite
apache
# Dans le VirtualHost HTTPS de xytherion.online

# BOSH (HTTP long-polling)
ProxyPass        /http-bind  http://127.0.0.1:5280/http-bind
ProxyPassReverse /http-bind  http://127.0.0.1:5280/http-bind

# WebSocket XMPP
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/xmpp-websocket$ "ws://127.0.0.1:5280/xmpp-websocket" [P,L]

ProxyPass        /xmpp-websocket  ws://127.0.0.1:5280/xmpp-websocket
ProxyPassReverse /xmpp-websocket  ws://127.0.0.1:5280/xmpp-websocket

# Upload de fichiers HTTP (XEP-0363)
ProxyPass        /upload  http://127.0.0.1:5280/upload
ProxyPassReverse /upload  http://127.0.0.1:5280/upload

Dans prosody.cfg.lua, configurez les URLs publiques pour l'upload :

ini
-- Dans la section VirtualHost ou globale de prosody.cfg.lua
http_upload_base_url = "https://xytherion.online/upload"
http_upload_file_size_limit = 104857600  -- 100 MB max par fichier
http_upload_quota = 1073741824           -- 1 GB par utilisateur

Modules essentiels détaillés

Message Carbons (XEP-0280) — sync multi-appareils

Sans Carbons, un message reçu sur votre téléphone n'apparaît pas sur votre PC. Carbons résout ça : chaque message est copié sur tous vos appareils connectés.

ini
-- Déjà activé avec "carbons" dans modules_enabled
-- Aucune configuration supplémentaire nécessaire
-- Le client doit demander l'activation (tous les clients modernes le font automatiquement)

Message Archive Management — MAM (XEP-0313)

MAM stocke les messages côté serveur et les synchronise quand vous vous reconnectez — indispensable si vous éteignez votre téléphone.

ini
-- Dans prosody.cfg.lua
archive_expires_after = "3m"   -- Conserver 3 mois (ou "1w", "1y", "never")

-- Par VirtualHost si besoin de règles différentes :
VirtualHost "xytherion.online"
    archive_expires_after = "6m"

-- Pour les salons MUC :
Component "conference.xytherion.online" "muc"
    modules_enabled = { "muc_mam" }
    muc_log_all_rooms = true
    muc_log_expires_after = "1y"

Stream Management — Smacks (XEP-0198)

Smacks permet de reprendre une session après une coupure réseau sans perdre de messages. Essentiel sur mobile (3G, WiFi fluctuant).

ini
-- Déjà dans modules_enabled avec "smacks"
-- Paramètres optionnels :
smacks_hibernation_time = 600   -- Garder la session en hibernation 10 minutes
                                 -- (permet de reprendre après coupure mobile)

HTTP File Upload (XEP-0363) — partage de fichiers

ini
-- Dans modules_enabled : "http_upload"
-- Dans prosody.cfg.lua :
http_upload_base_url = "https://xytherion.online/upload"
http_upload_file_size_limit = 104857600     -- 100 MB par fichier
http_upload_quota = 1073741824              -- 1 GB par utilisateur

-- Nettoyage automatique des vieux fichiers (optionnel)
http_upload_expire_after = 60 * 60 * 24 * 30   -- 30 jours (en secondes)

OMEMO : chiffrement de bout en bout

OMEMO (XEP-0384) est le protocole de chiffrement de bout en bout de XMPP. Il est basé sur le Signal Protocol (Double Ratchet + X3DH), exactement le même que Signal utilise. Ses propriétés :

  • E2E : le serveur ne voit jamais le contenu des messages
  • Perfect Forward Secrecy : une clé compromise ne compromet pas les messages passés
  • Multi-appareils : un message chiffré pour alice@serveur.com est chiffré pour TOUS ses appareils simultanément
  • Asynchrone : vous pouvez chiffrer un message même si le destinataire est hors ligne (les clés publiques sont stockées sur le serveur via PEP)

Activer PEP (Personal Eventing Protocol) — requis pour OMEMO

ini
-- PEP est nécessaire pour stocker les clés OMEMO sur le serveur
-- Ajouter dans modules_enabled :
modules_enabled = {
    -- ... autres modules ...
    "pep";              -- Personal Eventing Protocol (XEP-0163)
    "pep_simple";       -- Implémentation simplifiée, recommandée
}

-- PEP storage (garder les clés OMEMO)
storage = {
    archive = "internal";
    archive2 = "internal";
    -- Les clés OMEMO sont stockées dans pep, automatiquement

Comment OMEMO fonctionne techniquement

Quand Alice installe un client XMPP avec OMEMO :

  1. 1Son client génère une paire de clés d'identité (IK) et des pré-clés (PreKeys) Curve25519
  2. 2Ces clés publiques sont publiées sur le serveur via PEP
  3. 3Quand Bob veut écrire à Alice, il récupère ses clés publiques et les utilise pour dériver une clé de session (X3DH)
  4. 4Les messages sont chiffrés avec cette clé + Double Ratchet (clé différente pour chaque message)
  5. 5Le serveur ne voit que du chiffré — il ne peut pas lire, et ne peut pas recalculer les clés passées

OMEMO est activé côté CLIENT, pas côté serveur. Le serveur doit juste supporter PEP et MAM. Côté serveur, vous n'avez rien de plus à configurer que ce qui est ci-dessus.

Salons de discussion (MUC — Multi-User Chat)

bash
# Les salons sont créés par les clients (si restrict_room_creation = "local")
# Vous pouvez aussi les créer en ligne de commande via prosodyctl :

# Lister les salons existants
prosodyctl mod_muc_config --host conference.xytherion.online list

# Créer un salon permanent depuis un client :
# Se connecter au JID : general@conference.xytherion.online
# Dans la config du salon, cocher "Persistent"

# Voir les occupants d'un salon
prosodyctl shell
> muc:room("general@conference.xytherion.online"):occupants()
ini
-- Configuration avancée MUC dans prosody.cfg.lua
Component "conference.xytherion.online" "muc"
    name = "Salons Xytherion"
    restrict_room_creation = "local"   -- "local", true (admin only), false (tous)

    -- Valeurs par défaut pour les nouveaux salons
    muc_room_default_public = false             -- Salon privé par défaut
    muc_room_default_members_only = true        -- Membres uniquement par défaut
    muc_room_default_persistent = true          -- Salon permanent par défaut
    muc_room_default_history_length = 50        -- Historique à la connexion

    -- Logging et archivage
    modules_enabled = { "muc_mam"; "muc_occupant_id"; }
    muc_log_all_rooms = true
    muc_log_expires_after = "1y"
    max_history_messages = 100

Push notifications (XEP-0357)

Sur mobile, les clients XMPP utilisent les push notifications pour recevoir les messages quand l'app est en arrière-plan. Prosody supporte cela via mod_cloud_notify.

bash
# Installer le module community (hors dépôt Debian)
# Via luarocks ou le dépôt Prosody modules :
apt install -y mercurial
hg clone https://hg.prosody.im/prosody-modules/ /opt/prosody-modules

# Ajouter le chemin dans prosody.cfg.lua
plugin_paths = { "/opt/prosody-modules" }

# Puis dans modules_enabled :
# "cloud_notify"    -- XEP-0357 push notifications

# Alternative : utiliser un serveur de push externe compatible
# (UnifiedPush, ntfy, etc.)

Vérifier la conformité de votre serveur

Le site xmpp.net/observe permet de tester votre serveur XMPP et d'obtenir un score de conformité aux XEPs modernes.

bash
# Tester manuellement avec prosodyctl check
prosodyctl check

# Vérifier la connectivité s2s
prosodyctl check cert xytherion.online

# Test de connexion TLS
openssl s_client -connect xytherion.online:5222 -starttls xmpp -name xytherion.online   2>/dev/null | grep -E "Protocol|Cipher|Verify"

# Test s2s
openssl s_client -connect xytherion.online:5269 -starttls xmpp-server -name xytherion.online   2>/dev/null | grep -E "Protocol|Cipher|Verify"

# Test DNSSEC sur les SRV records
drill -TD _xmpp-client._tcp.xytherion.online SRV 2>/dev/null | grep -E "AD|Secure"

# Depuis un autre serveur XMPP, envoyer un message à votre JID est le meilleur test

Clients XMPP recommandés en 2026

Desktop

  • Gajim (Windows/Linux/macOS) — le client desktop le plus complet, OMEMO natif, gestion MUC avancée, plugins
  • Dino (Linux, GTK4) — interface épurée style moderne, OMEMO, MUC, intégration GNOME. Excellent pour les linuxiens
  • Beagle IM / Siskin IM (macOS/iOS — même projet) — les meilleurs clients Apple, OMEMO, push iOS
  • Monal (macOS/iOS) — alternatif Apple, open source, OMEMO

Mobile

  • Conversations (Android) — LA référence Android, OMEMO natif, excellente gestion de la batterie, push, transfert de fichiers. Payant sur Play Store, gratuit sur F-Droid
  • Monocles Chat (Android, fork de Conversations) — plus de features, F-Droid
  • Cheogram (Android) — fork de Conversations avec support appels, mieux sur certains réseaux
  • Monal (iOS) — meilleur client iOS actuel, OMEMO, push APNs
  • Siskin IM (iOS) — alternative Monal

Web

  • Converse.js — client web JavaScript, peut être self-hosted ou intégré dans votre site, OMEMO
  • ConverseJS + Prosody = stack complète self-hosted accessible depuis n'importe quel navigateur
bash
# Installer Converse.js en self-hosted avec Prosody
apt install -y npm
npm install -g @converse/headless

# Ou télécharger la version pré-buildée
wget https://github.com/conversejs/converse.js/releases/latest/download/converse.min.js
# Intégrer dans votre page HTML :
# <script src="converse.min.js"></script>
# <script>
#   converse.initialize({
#     bosh_service_url: 'https://xytherion.online/http-bind',
#     websocket_url: 'wss://xytherion.online/xmpp-websocket',
#   });
# </script>

Fédération : se connecter au réseau XMPP mondial

Par défaut, votre serveur Prosody accepte les connexions fédérées. Dès que les DNS SRV sont configurés et que TLS fonctionne, vous pouvez contacter n'importe quel serveur XMPP dans le monde.

ini
-- Contrôle de la fédération dans prosody.cfg.lua
s2s_require_encryption = true     -- TLS obligatoire pour s2s
s2s_secure_auth = false           -- false = fédérer avec tous (même sans DNSSEC)
                                   -- true  = uniquement avec DNSSEC + TLS valide

-- Liste blanche (n'accepter que ces serveurs) :
s2s_whitelist = { "jabber.org", "conversations.im" }

-- Liste noire (bloquer certains serveurs spammeurs) :
s2s_blacklist = { "spam.example.com" }

-- Serveurs XMPP publics notables avec lesquels fédérer :
-- jabber.org        (le serveur historique, depuis 1999)
-- conversations.im  (serveur des développeurs de Conversations Android)
-- disroot.org       (serveur militant, privacy-first)
-- 404.city          (serveur technique russe)
bash
# Tester la connexion fédérée vers un autre serveur
prosodyctl shell
> s2s:show()          -- Voir toutes les connexions s2s actives
> s2s:show("jabber.org")   -- Connexion vers jabber.org

# Depuis un compte sur votre serveur, envoyer un message cross-serveur :
# alice@xytherion.online → bob@jabber.org
# Si ça marche → votre fédération est opérationnelle

Cas d'usage avancés

Notifications serveur / alertes système via XMPP

XMPP est excellent pour envoyer des alertes système (Zabbix, Grafana, cron) depuis un serveur vers votre téléphone.

bash
# Envoyer un message XMPP depuis un script bash
apt install -y sendxmpp

# Configurer sendxmpp
cat > ~/.sendxmpprc << 'EOF'
bot@xytherion.online motdepasse
EOF
chmod 600 ~/.sendxmpprc

# Envoyer une alerte
echo "⚠️ Disque plein sur /dev/sda1 — 95%" | sendxmpp azuka@xytherion.online

# Depuis un cron job de monitoring :
# */5 * * * * df / | awk 'NR==2 {if($5+0>90) print "Disque "$5}' | sendxmpp azuka@xytherion.online

# Python — send XMPP message
pip install slixmpp
python3 << 'EOF'
import asyncio, slixmpp

class SendMsg(slixmpp.ClientXMPP):
    def __init__(self, jid, pwd, to, msg):
        super().__init__(jid, pwd)
        self.to, self.msg = to, msg
        self.add_event_handler("session_start", self.start)

    async def start(self, event):
        self.send_message(mto=self.to, mbody=self.msg, mtype='chat')
        self.disconnect()

xmpp = SendMsg("bot@xytherion.online", "password", "azuka@xytherion.online", "Alerte!")
xmpp.connect()
xmpp.process(forever=False)
EOF

XMPP pour l'IoT — protocole léger sur appareils embarqués

XMPP est utilisé dans l'IoT industriel (IEEE 802.15.4, Matter) grâce à son modèle publish-subscribe (PubSub). Un Raspberry Pi ou un ESP32 peut publier des mesures sur un nœud PubSub XMPP.

bash
# Exemple : Raspberry Pi publie la température sur un nœud PubSub XMPP
pip3 install slixmpp

python3 << 'EOF'
import asyncio, slixmpp
from slixmpp.plugins.xep_0060.stanza.pubsub import EventItem

class TempPublisher(slixmpp.ClientXMPP):
    def __init__(self):
        super().__init__("pi@xytherion.online", "password")
        self.register_plugin('xep_0030')  # Service discovery
        self.register_plugin('xep_0060')  # PubSub
        self.add_event_handler("session_start", self.publish_temp)

    async def publish_temp(self, event):
        # Lire la température du CPU
        with open('/sys/class/thermal/thermal_zone0/temp') as f:
            temp = int(f.read()) / 1000

        # Publier sur le nœud PubSub
        await self['xep_0060'].publish(
            'pubsub.xytherion.online',
            'temperature/pi',
            payload=f'<temp unit="C">{temp:.1f}</temp>'
        )
        print(f"Température publiée : {temp:.1f}°C")
        self.disconnect()

xmpp = TempPublisher()
xmpp.connect()
xmpp.process(forever=False)
EOF

Diagnostic et dépannage

bash
# Vérification complète de l'installation
prosodyctl check                    # Syntaxe config + certificats + DNS

# Voir les connexions en temps réel
prosodyctl shell
> c2s:show()         -- Clients connectés
> s2s:show()         -- Serveurs fédérés connectés
> host:users("xytherion.online")    -- Utilisateurs actifs

# Activer le debug temporairement
# Dans prosody.cfg.lua : log = { debug = "*" }
systemctl reload prosody
tail -f /var/log/prosody/prosody.log | grep -E "ERROR|WARN|debug"

# Tester la connexion client manuellement
openssl s_client -connect xytherion.online:5222 -starttls xmpp
# Puis envoyer : <stream:stream xmlns='jabber:client' to='xytherion.online'>

# Vérifier les SRV DNS depuis l'extérieur
dig +short SRV _xmpp-client._tcp.xytherion.online
dig +short SRV _xmpp-server._tcp.xytherion.online

# Test de connexion s2s depuis un autre serveur
# Sur le serveur distant :
telnet xytherion.online 5269
# ou
curl -v telnet://xytherion.online:5269

Problèmes fréquents et solutions

  • Erreur 'No valid certificate' : prosodyctl --root cert import /etc/letsencrypt/live/ puis systemctl reload prosody
  • Fédération échoue avec 'certificate-mismatch' : vérifiez que le certificat couvre les sous-domaines (conference., proxy., pubsub.)
  • Client se déconnecte souvent sur mobile : activez smacks avec smacks_hibernation_time = 600
  • Upload de fichiers échoue : vérifiez le reverse proxy Apache et que http_upload_base_url est en HTTPS
  • Pas de messages hors ligne : vérifiez que 'mam' est dans modules_enabled et que archive_expires_after > 0
  • OMEMO ne fonctionne pas : vérifiez que PEP est activé ('pep' dans modules_enabled) et que MAM est configuré
  • Erreur 'no shared cipher' : mettez à jour openssl et vérifiez la directive ssl.ciphers dans prosody.cfg.lua

XMPP vs Signal vs Matrix vs Telegram

Chaque protocole a ses forces. Voici une comparaison honnête :

  • XMPP : décentralisé, fédéré, self-hostable, OMEMO E2E, protocole 25 ans. Interface client variable selon l'app. Idéal pour contrôle total et infrastructure proprio.
  • Signal : E2E parfait, UX excellente, protocole ouvert. Mais centralisé (Signal Foundation) — dépend de numéros de téléphone et d'une infrastructure unique. Ne se fédère pas.
  • Matrix/Element : décentralisé, fédéré, multi-device. Serveurs très lourds (Synapse consomme 1-4 GB de RAM vs ~50 MB pour Prosody). Bridges vers WhatsApp/Telegram/Discord.
  • Telegram : pratique, populaire. Pas de E2E par défaut (chiffrement cloud uniquement), propriétaire, serveurs en Dubaï. Chats secrets = E2E mais pas multi-device.
  • WhatsApp : E2E Signal Protocol (ironie), mais Meta collecte les métadonnées, propriétaire, pas fédéré.

Le meilleur choix dépend de votre use case. Pour la vie privée personnelle maximale avec UX simple → Signal. Pour infrastructure d'équipe souveraine et contrôle total → XMPP. Pour bridges vers tous les protocoles → Matrix. Pour audience grand public → Telegram ou Signal.

Sécuriser votre serveur Prosody

ini
-- prosody.cfg.lua — section sécurité complète

-- 1. Interdire l'inscription publique
allow_registration = false

-- 2. Forcer TLS partout
c2s_require_encryption = true
s2s_require_encryption = true

-- 3. Mots de passe hashés
authentication = "internal_hashed"

-- 4. Rate limiting
limits = {
    c2s = { rate = "10kb/s"; burst = "50kb/s" };
    s2s = { rate = "30kb/s"; burst = "300kb/s" };
}

-- 5. Timeout des connexions inactives (secondes)
c2s_timeout = 300

-- 6. Limiter la taille des stanzas (anti-DoS)
limits = {
    c2s = {
        rate = "10kb/s";
        burst = "50kb/s";
        max_stanza_size = 262144;   -- 256 KB max par stanza
    }
}
bash
# Vérifier que Prosody tourne sous son propre utilisateur (non-root)
ps aux | grep prosody
# prosody   12345  ...   prosody (version)   ← doit être l'utilisateur "prosody", pas root

# Permissions des fichiers
ls -la /var/lib/prosody/       # Doit appartenir à prosody:prosody
ls -la /etc/prosody/certs/     # Les clés privées doivent être 600

# Configurer fail2ban pour XMPP (optionnel)
# /etc/fail2ban/filter.d/prosody.conf
cat > /etc/fail2ban/filter.d/prosody.conf << 'EOF'
[Definition]
failregex = <HOST> failed to authenticate
ignoreregex =
EOF

# /etc/fail2ban/jail.d/prosody.conf
cat > /etc/fail2ban/jail.d/prosody.conf << 'EOF'
[prosody]
enabled = true
port    = 5222,5223
filter  = prosody
logpath = /var/log/prosody/prosody.log
maxretry = 5
bantime  = 3600
EOF

systemctl restart fail2ban

Monitoring de votre serveur XMPP

bash
# Statistiques Prosody en temps réel
prosodyctl shell

# Dans le shell Prosody :
> stats:show()           -- CPU, mémoire, connexions
> c2s:count()            -- Nombre de clients connectés
> s2s:count()            -- Connexions fédérées
> host:users("xytherion.online")  -- Comptes actifs

# Statistiques via HTTPS (activer mod_http_status dans prosody.cfg.lua)
# modules_enabled = { ... "http_status" ... }
# curl http://127.0.0.1:5280/status_json

# Intégration Prometheus (module community)
# plugin_paths = { "/opt/prosody-modules" }
# modules_enabled = { ... "prometheus" ... }
# curl http://127.0.0.1:5280/metrics  → format Prometheus

# Alertes simples via cron
# Vérifier que Prosody tourne et qu'un ping répond
# */5 * * * * systemctl is-active prosody || echo "Prosody DOWN" | sendxmpp admin@xytherion.online

Testez régulièrement votre serveur sur xmpp.net/observe — il vérifie TLS, SRV DNS, XMPP compliance et donne un score. Visez A ou A+. Le site conversations.im/compliance vérifie aussi les XEPs supportées.

Sources & références

  1. 1
    Prosody IM — Documentation officielle

    Documentation complète de référence Prosody — la meilleure source pour la config

  2. 2
    XMPP Standards Foundation — XEPs

    Toutes les extensions XMPP (XEPs) — la référence protocolaire officielle

  3. 3
    conversations.im — Compliance Tester

    Tester la conformité de votre serveur aux XEPs modernes

  4. 4
    OMEMO — XEP-0384

    Spécification officielle OMEMO E2E basé sur le Signal Protocol

  5. 5
    xmpp.net/observe — Server Tester

    Test de sécurité TLS et conformité de votre serveur XMPP

  6. 6
    Prosody modules community

    Catalogue des modules communautaires Prosody (cloud_notify, prometheus, etc.)

#xmpp#prosody#messagerie#chiffrement#omemo#fédération#vie-privée#self-hosted

Testez vos configurations

Xytherion Tools propose des outils gratuits pour vérifier vos DNS, auditer votre SSL, tester SPF/DKIM/DMARC et bien plus — directement depuis votre navigateur.

XMPP en 2026 : messagerie décentralisée, chiffrée et fédérée — Guide complet — Xytherion Tools