Aller au contenu

Le certificat

Vous n’en avez pas besoin pour utiliser le tĂ©lĂ©phone. DĂšs l’installation, sans aucune configuration, un joueur peut scanner le QR code dans ParamĂštres â€ș Appareils liĂ©s pour transformer son vrai smartphone en tĂ©lĂ©phone de son personnage : messages, e-mails, contacts, City ID, garage, propriĂ©tĂ©s, tableau d’annonces, lieux sauvegardĂ©s. Tout fonctionne sur une simple connexion HTTP via le port que votre serveur a dĂ©jĂ  d’ouvert.

Ce qu’apporte un certificat, c’est ce qu’un navigateur refuse d’accorder Ă  une page non sĂ©curisĂ©e :

HTTP simpleHTTPS
Messages, e-mails, garage, tout le resteouioui
Notifications avec la page ferméenonoui
Le microphone, pour enregistrer des notes vocalesnonoui
L’installer comme une app sur Android, avec son icînenonoui
Mention “Non sĂ©curisĂ©â€ dans la barre d’adresseaffichĂ©emasquĂ©e
Le token de sessioncircule en clairchiffré

Cette derniĂšre ligne n’est pas qu’une question d’esthĂ©tique. En HTTP classique, une personne connectĂ©e au mĂȘme rĂ©seau Wi-Fi que votre joueur peut intercepter sa session et lire son tĂ©lĂ©phone. Pour une ville de jeu de rĂŽle, cela peut ĂȘtre un compromis acceptable ; encore faut-il que ce soit un choix dĂ©libĂ©rĂ© et non une surprise.

Vous avez un nom de domaine pointĂ© sur le serveur — laissez le tĂ©lĂ©phone obtenir son propre certificat

Section intitulĂ©e « Vous avez un nom de domaine pointĂ© sur le serveur — laissez le tĂ©lĂ©phone obtenir son propre certificat »

C’est la mĂ©thode la plus rapide, et elle ne nĂ©cessite aucun logiciel additionnel sur la machine. La ressource effectue la demande de certificat auprĂšs de Let’s Encrypt, valide le challenge d’elle-mĂȘme, sert le flux TLS et renouvelle le certificat automatiquement tant qu’elle fonctionne.

-- shared/server_config.lua (server-only: this file is never sent to a client)
ServerConfig.Web = {
Url = 'https://phone.yourserver.com/',
Https = {
Enabled = true,
Names = { 'phone.yourserver.com' },
Contact = '[email protected]',
},
}

Ensuite, une seule fois :

  1. Faites pointer ce nom de domaine vers le serveur. Sur un VPS, c’est un simple enregistrement A. Vous n’avez pas de domaine à vous ? duckdns.org vous en fournit un gratuitement en une minute qui ne changera jamais.
  2. Laissez passer les ports 443 et 80 Ă  travers le pare-feu. Le port 80 n’est ouvert que pendant la demande du certificat, puis refermĂ© aussitĂŽt la rĂ©ponse reçue — le journal de log signale ces deux Ă©tapes.

La commande phonehttps affiche l’état actuel du certificat. phonehttps check interroge le serveur de test de Let’s Encrypt pour savoir s’il parvient Ă  communiquer avec votre machine, une dĂ©marche idĂ©ale Ă  entreprendre si aucun certificat n’arrive : cela permet de distinguer un souci sur votre pare-feu d’un problĂšme sur cette ressource.

Le renouvellement s’opĂšre automatiquement lorsqu’il reste encore un tiers de durĂ©e de vie au certificat, avec une vĂ©rification toutes les six heures.

Si le serveur est hĂ©bergĂ© Ă  domicile, l’adresse IP change

Section intitulĂ©e « Si le serveur est hĂ©bergĂ© Ă  domicile, l’adresse IP change »

Un fournisseur d’accĂšs rĂ©sidentiel modifie l’adresse IP quand bon lui semble, et dĂšs que cela arrive, le nom de domaine pointe vers la box d’un inconnu : les smartphones liĂ©s ne peuvent plus joindre le serveur et le certificat ne peut plus ĂȘtre renouvelĂ©. Cette ressource le dĂ©tecte dĂ©jĂ  d’elle-mĂȘme — elle interroge sa propre adresse toutes les demi-heures pour le QR code — et sur un domaine DuckDNS, elle peut Ă©galement corriger le tir :

-- shared/server_config.lua
DuckDNS = {
Enabled = true,
Domains = { 'yourname' }, -- the part in front of .duckdns.org
Token = '01d8b39f-...', -- from your duckdns.org page
},

La ressource est prĂ©venue dĂšs que l’adresse change, ainsi qu’une fois par jour en l’absence de changement — ce battement de cƓur sert Ă©galement Ă  rĂ©tablir la situation aprĂšs une coupure Internet oĂč l’adresse aurait changĂ© sans pouvoir ĂȘtre signalĂ©e. Lorsque la mise Ă  jour rĂ©ussit, le journal le consigne sans dĂ©clencher d’alerte ; lorsqu’elle Ă©choue, l’avertissement classique est envoyĂ©, y compris vers le webhook Server.

Sur un VPS, l’adresse IP est fixe et rien de tout cela n’est nĂ©cessaire. Laissez Enabled = false.

Vous n’avez rien Ă  faire. Si sv_listingHostOverride est configurĂ©, le QR code est automatiquement gĂ©nĂ©rĂ© sous la forme https://your.domain/mic_phone/web/, car ce proxy achemine l’intĂ©gralitĂ© de la racine vers votre serveur. C’est le scĂ©nario le plus simple et il est dĂ©jĂ  pris en charge nativement.

Vous utilisez déjà un reverse proxy et préférez conserver cette configuration

Section intitulée « Vous utilisez déjà un reverse proxy et préférez conserver cette configuration »

Une ligne dans shared/config/web.lua :

Url = 'https://phone.yourserver.com/mic_phone/web/',

et un reverse proxy en amont qui gÚre le TLS et transfÚre le trafic vers le port de jeu. Avec Caddy, cela se résume à deux lignes dans un Caddyfile :

phone.yourserver.com {
reverse_proxy 127.0.0.1:30120
}

Avec nginx, redirigez / vers 127.0.0.1:30120 et dĂ©sactivez la mise en mĂ©moire tampon (proxy_buffering off;), sous peine de bloquer le flux d’évĂ©nements et de priver le tĂ©lĂ©phone de toute rĂ©ception en temps rĂ©el.

Une configuration qui ne fonctionne pas : activer le nuage orange de Cloudflare sur un enregistrement DNS pointant directement vers le port 30120. Le proxy Cloudflare n’accepte qu’une liste restreinte de ports d’origine — 80, 8080, 8880, 2052, 2082, 2086, 2095 et 443, 2053, 2083, 2087, 2096, 8443 — et 30120 n’en fait pas partie. Vous devez intercaler votre propre proxy devant, comme expliquĂ© ci-dessus.

Vous ne pouvez rien installer sur la machine — mais ce n’est pas nĂ©cessaire : la premiĂšre mĂ©thode prĂ©sentĂ©e plus haut n’installe rien d’autre que cette ressource. Ce dont vous avez besoin de la part de votre hĂ©bergeur, ce sont deux ports dĂ©diĂ©s, le 443 et le 80, ainsi qu’un nom de domaine pointĂ© vers le serveur. De nombreux prestataires vous les accordent, tandis que certains partagent ces ports entre tous les clients de la machine et vous refuseront les deux. Demandez-leur l’accĂšs Ă  ces ports avant toute chose ; si la rĂ©ponse est nĂ©gative, faites pointer un domaine vers un tunnel Cloudflare nommĂ© Ă  la place.

Vous ne pouvez ouvrir aucun port — pas de domaine ou blocage par l’opĂ©rateur

Section intitulĂ©e « Vous ne pouvez ouvrir aucun port — pas de domaine ou blocage par l’opĂ©rateur »

Dans ce cas, utilisez un tunnel : tools/tunnel.ps1 lance un tunnel rapide Cloudflare (quick tunnel), Ă©crit l’adresse obtenue dans la configuration et vous invite Ă  redĂ©marrer la ressource. Aucun port Ă  ouvrir, aucun certificat Ă  manipuler.

Gardez nĂ©anmoins Ă  l’esprit ce que cela implique : un quick tunnel est Ă©phĂ©mĂšre par conception. L’adresse est gĂ©nĂ©rĂ©e alĂ©atoirement et une nouvelle adresse est rĂ©attribuĂ©e Ă  chaque redĂ©marrage du tunnel — or, un navigateur associant une application installĂ©e, son token mĂ©morisĂ© et son abonnement push Ă  l’adresse exacte d’origine, tous ces Ă©lĂ©ments doivent ĂȘtre reconfigurĂ©s Ă  chaque fois. Cette solution est idĂ©ale pour tester. Pour tout environnement destinĂ© Ă  durer, faites pointer un nom de domaine vers un tunnel nommĂ©, qui conserve son adresse — cela nĂ©cessite un compte Cloudflare avec un domaine rattachĂ©.

Le tĂ©lĂ©phone maintient une connexion persistante ouverte pour intercepter les messages dĂšs leur arrivĂ©e, et il l’initialise avec une requĂȘte POST plutĂŽt que le traditionnel GET de l’API EventSource. Deux raisons motivent ce choix, Ă  retenir si vous placez un reverse proxy en amont :

  • Un token prĂ©sent dans une query string se retrouve consignĂ© dans chaque journal de proxy traversĂ© entre le tĂ©lĂ©phone et le serveur. Dans le corps d’une requĂȘte POST, ce n’est pas le cas.
  • Un quick tunnel Cloudflare maintient un flux d’évĂ©nements GET bloquĂ© tant que le serveur ne clĂŽture pas la connexion, alors qu’il laisse circuler un flux POST (cloudflared#1449). De nombreux proxys mettent Ă©galement en mĂ©moire tampon les flux GET par dĂ©faut.

Le serveur rĂ©pond Ă©galement aux requĂȘtes GET sur les mĂȘmes routes, pour les clients ne prenant en charge que l’API EventSource.