Richard Dern

Communiquer via XMPP

On utilise le protocole XMPP notamment dans des applications de messagerie instantanées, mais son ouverture permet de l’embarquer dans à peu près tout type d’applications, y compris des réseaux sociaux.

Nous allons installer sur notre cloud personnel un serveur XMPP, qui, bien sûr, va nous permettre de communiquer avec le monde entier, mais dont nous nous servirons également à d’autres fins…

Nous exploiterons le serveur prosody, et son serveur BOSH, qui va nous permettre de faire appel à une application web pour avoir son propre webchat et créer sa propre communauté. En outre, nous nous en servirons dans un prochain article consacré à un remplaçant pour Google+/facebook/twitter.

Depuis que j’écris cette série d’articles consacrés au cloud personnel, j’essaye de proposer des guides mettant en place des solutions évolutives. Notre serveur mail est capable d’accueillir une infinité (virtuelle) de domaines et d’utilisateurs par exemple. J’appliquerai le même principe à prosody : vous pourrez disposer d’un nombre illimité de comptes sur un nombre illimité de domaines.

L’installation de prosody ne pose aucun problème, à condition de configurer le dépôt :

echo "deb http://packages.prosody.im/debian stable main" > /etc/apt/sources.list.d/prosody.list
apt-get update
apt-get install prosody-0.9 liblua5.1-0 liblua5.1-dbi0 liblua5.1-expat0 liblua5.1-filesystem0 liblua5.1-sec0 liblua5.1-socket2 lua-zlib lua5.1

Nous utiliserons notre base de données MySQL pour stocker les données de prosody. On va donc devoir créer un utilisateur dédié, que nous nommerons par exemple XMPP. Procédez comme d’habitude (générez le mot de passe, définissez l’hôte comme étant “localhost”, et créez la base de données portant le même nom).

Configuration

On va se passer de la configuration par défaut :

cd /etc/prosody
/etc/init.d/prosody stop
mv prosody.cfg.lua prosody.cfg.lua-orig
rm conf.avail/* conf.d/*
nano prosody.cfg.lua
storage = "sql"
sql = {
    driver = "MySQL";
    database = "XMPP";
    host = "localhost";
    username = "XMPP";
    password = "VotreMotDePasse";
}

admins { "contact@exemple.fr" }

modules_enabled = {
    "roster";
    "saslauth";
    "dialback";
    "disco";
    "tls";
    "private";
    "vcard";
    "compression";
    "legacyauth";
    "version";
    "uptime";
    "time";
    "ping";
    "pep";
    "register";
    "privacy";
    "posix";
    "bosh";
    "groups";
    "announce";
    "watchregistrations";
};

bosh_ports { "http-bind" }
cross_domain_bosh = true

allow_registration = true;

log = {
    { levels = { "error" }; to = "syslog";  };
    { levels = { "error" }; to = "file"; filename = "/var/log/prosody/prosody.err";  };
    { levels = { min = "info" }; to = "file"; filename = "/var/log/prosody/prosody.log";  };
}

pidfile = "/var/run/prosody/prosody.pid"

Include "/etc/prosody/conf.d/*.lua"

Quelques remarques :

Créons ensuite notre premier hôte virtuel :

nano conf.avail/exemple.fr.cfg.lua
VirtualHost "exemple.fr"
    enabled = true

    ssl = {
        key = "/scripts/certificate_authority/prosody/exemple.fr.key";
        certificate = "/scripts/certificate_authority/prosody/exemple.fr.crt";
    }

    Component "conference.exemple.fr" "muc"

Vu que nous définissons une clé et un certificat, il faut les créer :

/scripts/certificate_authority/make_request prosody exemple.fr
/scripts/certificate_authority/sign_request prosody exemple.fr

Warning : Lorsque le Common Name vous sera demandé, indiquez le nom de domaine ! Et dans notre cas, acceptez la création d’une clé sans mot de passe !

De la même manière que la commande a2ensite fournie par apache créé un lien symbolique depuis /etc/apache2/sites-available/ vers /etc/apache2/sites-enabled/ pour l’hôte virtuel concerné, il faut activer les hôtes virtuels dans prosody. Malheureusement, il n’existe pas de commande du même genre, il faut donc créer ce lien à la main :

ln -s conf.avail/exemple.fr conf.d/exemple.fr

On peut redémarrer prosody :

/etc/init.d/prosody start

Et créer votre premier utilisateur :

prosodyctl adduser contact@exemple.fr MotDePasse

Une fois fait, retournez dans phpMyAdmin pour vérifier que l’utilisateur a été correctement enregistré en base de données.

Firewall

nano /scripts/firewall

Entre les lignes :

##### Configuration personnalisée #####

Et :

##### Fin : Configuration personnalisée #####

Rajoutez les lignes suivantes :

${IPT} -A SERVICES -p tcp --dport 5222 -j ACCEPT
${IPT} -A SERVICES -p tcp --dport 5269 -j ACCEPT

N’oubliez pas de relancer le script :

/scripts/firewall

DNS

Éditons le fichier de configuration de notre zone :

nano /etc/bind/db.exemple.fr

Modifiez l’identifiant du fichier de configuration, comme d’habitude, puis ajoutez les lignes suivantes à la fin du fichier :

_xmpp-client._tcp	86400	IN	SRV	20	0	5222	exemple.fr.
_xmpp-server._tcp	86400	IN	SRV	20	0	5269	exemple.fr.

Et redémarrez bind :

/etc/init.d/bind9 restart

Votre serveur est prêt, fonctionnel, et accessible de l’extérieur.

Installation d’un client XMPP

Il existe une grande variété de clients XMPP, qui s’installent tous très facilement : jetez un oeil à la logithèque de votre distribution préférée pour en trouver. Une liste est disponible sur le site officiel du protocole XMPP. Parmi les plus répandus sous GNU/Linux on citera pidgin, empathy, ou encore kopete.

Installation du webchat

Nous installerons Jappix. Il va nous permettre un certain nombre de choses, et notamment tester le serveur BOSH. Pour commencer, on va créer un nouveau sous-domaine :

mkdir-p /var/www/exemple.fr/xmpp/{www,log}
nano /etc/apache2/sites-available/xmpp.exemple.fr
<VirtualHost *:80>
	ServerName xmpp.exemple.fr.fr
	Redirect / https://xmpp.exemple.fr/
</VirtualHost>

<VirtualHost *:443>
	ServerName xmpp.exemple.fr

	DocumentRoot /var/www/exemple.fr/xmpp/www

	SSLEngine On
	SSLCertificateFile /scripts/certificate_authority/xmpp.exemple.fr.crt
	SSLCertificateKeyFile /scripts/certificate_authority/xmpp.exemple.fr.key

	ProxyPass /http-bind/ http://127.0.0.1:5280/http-bind/
	ProxyPassReverse /http-bind/ http://127.0.0.1:5280/http-bind/
	Header set Access-Control-Allow-Origin "*"
</VirtualHost>

Comme d’habitude lors de la création d’un site sécurisé, on créé la paire clé/certificat :

/scripts/certificate_authority/make_request apache xmpp.exemple.fr
/scripts/certificate_authority/sign_request apache xmpp.exemple.fr
chown www-data:www-data /scripts/certificate_authority/apache/*

Warning : Lorsque le Common Name vous sera demandé, indiquez le nom de domaine ! Et dans notre cas, acceptez la création d’une clé sans mot de passe !

a2ensite xmpp.exemple.fr
/etc/init.d/apache2 restart

On télécharge et on installe Jappix :

cd /usr/src
wget http://codingteam.net/project/jappix/download/file/jappix-spaco-0.9.zip
unzip jappix-spaco-0.9.zip

Important : Si vous n’avez pas encore installé le paquet unzip et que vous avez une erreur lors de la décompression de l’archive, installez-le :

apt-get install unzip
cp -Rv jappix/* /var/www/exemple.fr/xmpp/www/
chown -R www-data:www-data

Et accédez au site pour le configurer, via http://xmpp.exemple.fr.

La première étape va être de créer l’utilisateur administrateur, alors laissez-vous guider par l’assistant. Vous avez ensuite accès à d’autres options, et particulièrement les hôtes, que vous configurerez comme suit :

Hôte principal exemple.fr
Hôte de salons conference.exemple.fr
Hôte pubsub pubsub.exemple.fr
Hôte BOSH https://xmpp.exemple.fr/http-bind/

Pensez également à configurer la variable “Salons à rejoindre“de l’onglet”Configuration”, en spécifiant le nom d’un salon quelconque, sous la forme salon@conference.exemple.fr. Cochez également les cases relatives au chiffrement et au HTTPS, et la case “Lien du gestionnaire”. Enfin, décochez la case “Verrouiller l’hôte” si vous souhaitez que des comptes non gérés par votre serveur puissent se connecter.

Tests

Testez ensuite une première fois la connexion, en cliquant sur le bouton “Fermer” tout en haut à droite. Vous pourrez ensuite revenir à l’interface de configuration depuis le lien “Gestionnaire”. Cliquez sur le gros bouton “Connexion”, indiquez vos identifiants (par exemple, contact@exemple.fr) et votre mot de passe. La connexion devrait être immédiate.

Si ce n’est pas le cas, c’est probablement une question de connexion sécurisée. Consultez les fichiers journaux de prosody et apache pour tenter de déterminer d’où vient le problème.

Important : Le second test est optionnel : il devrait être effectué si vous permettez à des clients qui n’existent pas sur votre serveur de se connecter.

Si vous avez réussi à vous connecter, nous allons procéder à un second test, visant à vérifier le bon fonctionnement du serveur BOSH pour les clients externes. Si vous disposez déjà d’un compte XMPP ailleurs que sur votre propre serveur, essayez de vous connecter avec ces identifiants. Sinon, vous pouvez vous créer rapidement une adresse sur le site jabber.org.

Échanger autour de ce texte

Si vous souhaitez réagir publiquement, un fil dédié vous attend.

Ouvrir le fil de discussion

Taxonomies

Tags