<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>#diagnostic — Blog d'Ange Bonkoski</title><link>https://journal.ange-bonkoski.fr/tags/diagnostic/</link><description>Journal de mon homelab et write-ups de labs de cybersécurité.</description><language>fr</language><copyright>Ange Bonkoski, licence CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/deed.fr)</copyright><lastBuildDate>Mon, 19 Oct 2026 11:00:00 +0200</lastBuildDate><atom:link href="https://journal.ange-bonkoski.fr/tags/diagnostic/index.xml" rel="self" type="application/rss+xml"/><item><title>Quatre blocages en une journée : diagnostiquer couche par couche</title><link>https://journal.ange-bonkoski.fr/journal/guacamole-couche-par-couche/</link><pubDate>Mon, 19 Oct 2026 11:00:00 +0200</pubDate><guid>https://journal.ange-bonkoski.fr/journal/guacamole-couche-par-couche/</guid><category>homelab</category><category>guacamole</category><category>ssh</category><category>vnc</category><category>diagnostic</category><description>&lt;p&gt;Je voulais pouvoir administrer mon serveur et prendre la main sur mon PC&#10;fixe depuis &lt;strong&gt;n&amp;rsquo;importe quel navigateur&lt;/strong&gt;, même sur un téléphone, sans rien&#10;installer. C&amp;rsquo;est le rôle d&amp;rsquo;&lt;strong&gt;Apache Guacamole&lt;/strong&gt; : un bastion d&amp;rsquo;accès web.&lt;/p&gt;&#10;&lt;p&gt;L&amp;rsquo;installation m&amp;rsquo;a pris une journée, et j&amp;rsquo;ai buté quatre fois. Ce n&amp;rsquo;est pas&#10;le nombre de blocages qui m&amp;rsquo;a appris le plus, c&amp;rsquo;est la méthode qui a permis&#10;de tous les résoudre.&lt;/p&gt;&#10;&lt;h2 id="comment-guacamole-fonctionne"&gt;Comment Guacamole fonctionne&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Navigateur ──HTTPS──&amp;gt; Guacamole (interface web)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; guacd ──SSH──&amp;gt; serveur&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └─VNC──&amp;gt; PC fixe&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le navigateur ne parle qu&amp;rsquo;en HTTPS avec l&amp;rsquo;interface web. C&amp;rsquo;est &lt;code&gt;guacd&lt;/code&gt;, un&#10;petit moteur qui tourne sur le serveur, qui ouvre réellement les connexions&#10;SSH ou VNC vers les machines cibles, puis renvoie l&amp;rsquo;image au navigateur.&#10;Une base PostgreSQL garde les comptes et les connexions. Les trois tournent&#10;dans des conteneurs Docker, et aucun ne publie de port : on y accède&#10;seulement par mon réseau privé Tailscale, avec double authentification.&lt;/p&gt;&#10;&lt;h2 id="blocage-n1--le-certificat-qui-refusait-de-se-faire"&gt;Blocage n°1 : le certificat qui refusait de se faire&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Symptôme :&lt;/strong&gt; « Internal Error » en enregistrant le nom de domaine dans le&#10;reverse proxy.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Le journal :&lt;/strong&gt; &lt;code&gt;docker logs&lt;/code&gt; du reverse proxy montrait la commande de&#10;Let&amp;rsquo;s Encrypt avec &lt;code&gt;--preferred-challenges http&lt;/code&gt;, puis&#10;&lt;code&gt;Some challenges have failed&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;La cause :&lt;/strong&gt; j&amp;rsquo;avais oublié de cocher « Use a DNS Challenge ». Le défi&#10;HTTP demande à Let&amp;rsquo;s Encrypt de venir chercher un fichier sur mon serveur&#10;depuis Internet… alors qu&amp;rsquo;aucun port n&amp;rsquo;est ouvert. Il ne pouvait&#10;&lt;strong&gt;qu&amp;rsquo;échouer&lt;/strong&gt;. Avec le défi DNS, le certificat est arrivé en une minute.&lt;/p&gt;&#10;&lt;p&gt;Cet échec avait un bon côté : il prouvait que mon serveur est vraiment&#10;injoignable depuis Internet.&lt;/p&gt;&#10;&lt;h2 id="blocage-n2--la-clé-ssh--au-format-inconnu-"&gt;Blocage n°2 : la clé SSH « au format inconnu »&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Symptôme :&lt;/strong&gt; la connexion SSH vers le serveur échoue.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Le journal, côté client&lt;/strong&gt; (&lt;code&gt;guacd&lt;/code&gt;) :&#10;&lt;code&gt;Unable to extract public key from private key file: Unsupported private key file format&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Le journal, côté serveur&lt;/strong&gt; (&lt;code&gt;sshd&lt;/code&gt;) : une connexion fermée avant&#10;authentification, puis une pénalité de 10 secondes pour cette adresse.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;La cause :&lt;/strong&gt; j&amp;rsquo;avais collé la clé privée &lt;strong&gt;sans&lt;/strong&gt; ses lignes&#10;&lt;code&gt;-----BEGIN …&lt;/code&gt; et &lt;code&gt;-----END …&lt;/code&gt;. Sans elles, impossible de reconnaître le&#10;format. Elles font partie de la clé.&lt;/p&gt;&#10;&lt;p&gt;Le journal du serveur m&amp;rsquo;a aussi appris quelque chose : les versions&#10;récentes de &lt;code&gt;sshd&lt;/code&gt; &lt;strong&gt;pénalisent&lt;/strong&gt; une adresse qui se connecte sans&#10;s&amp;rsquo;authentifier. Pendant le diagnostic, les reconnexions automatiques de&#10;Guacamole aggravaient la situation. J&amp;rsquo;ai dû les couper.&lt;/p&gt;&#10;&lt;h2 id="blocage-n3--le-bureau-à-distance-qui-nexistait-pas"&gt;Blocage n°3 : le Bureau à distance… qui n&amp;rsquo;existait pas&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Symptôme :&lt;/strong&gt; impossible de joindre mon PC fixe en RDP.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;La vérification :&lt;/strong&gt; « À propos de Windows » → &lt;strong&gt;Windows 11 Famille&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;La cause :&lt;/strong&gt; l&amp;rsquo;édition Famille ne peut pas &lt;strong&gt;recevoir&lt;/strong&gt; de connexion&#10;Bureau à distance, c&amp;rsquo;est réservé aux éditions Pro. Plutôt que de payer une&#10;licence, je suis passé à &lt;strong&gt;VNC&lt;/strong&gt; avec TightVNC (gratuit), verrouillé par&#10;deux protections indépendantes : TightVNC n&amp;rsquo;accepte que l&amp;rsquo;adresse du&#10;serveur, et le pare-feu Windows aussi.&lt;/p&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&lt;div class="encadre encadre-attention" role="note"&gt;&#10; &lt;p class="encadre-titre"&gt;&#10; &#10; &#10; &lt;svg aria-hidden="true" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z"/&gt;&lt;path d="M12 9v4"/&gt;&lt;path d="M12 17h.01"/&gt;&lt;/svg&gt;&#10; &#10; &lt;span&gt;L&amp;#39;installateur qui ouvre une porte sans le dire&lt;/span&gt;&#10; &lt;/p&gt;&#10; &#10; &lt;div class="encadre-contenu"&gt;&#10; &lt;p&gt;En vérifiant le pare-feu après coup, j&amp;rsquo;ai trouvé une règle créée par&#10;l&amp;rsquo;installateur de TightVNC : elle autorisait &lt;strong&gt;tout le monde&lt;/strong&gt; à se&#10;connecter. Je l&amp;rsquo;ai désactivée. Toujours relire le pare-feu après avoir&#10;installé un logiciel serveur.&lt;/p&gt;&#10;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&#10;&lt;h2 id="blocage-n4---unable-to-connect-to-vnc-server-"&gt;Blocage n°4 : « Unable to connect to VNC server »&lt;/h2&gt;&#10;&lt;p&gt;C&amp;rsquo;est le blocage le plus instructif, parce que je l&amp;rsquo;ai résolu en&#10;remontant les couches une par une :&lt;/p&gt;&#10;&#10;&lt;div class="tableau" role="region" aria-label="Tableau" tabindex="0"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th class="aligne-left"&gt;Couche&lt;/th&gt;&#10; &lt;th class="aligne-left"&gt;Test&lt;/th&gt;&#10; &lt;th class="aligne-left"&gt;Résultat&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td class="aligne-left"&gt;Réseau (TCP)&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;le port 5900 du PC répond-il depuis le serveur ?&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;oui&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td class="aligne-left"&gt;Service&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;le PC renvoie-t-il une bannière VNC (&lt;code&gt;RFB 003.008&lt;/code&gt;) ?&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;oui, même depuis le conteneur de &lt;code&gt;guacd&lt;/code&gt;&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td class="aligne-left"&gt;Authentification&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;que dit le journal de TightVNC ?&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;&lt;code&gt;Authentication failed&lt;/code&gt;&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Le réseau et le service étaient bons. Le problème était à la dernière&#10;couche : le mot de passe VNC enregistré dans Guacamole et celui de&#10;TightVNC &lt;strong&gt;n&amp;rsquo;étaient pas les mêmes&lt;/strong&gt;. Je les ai redéfinis des deux côtés à&#10;partir de mon gestionnaire de mots de passe, et tout a fonctionné.&lt;/p&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&lt;div class="encadre encadre-lecon" role="note"&gt;&#10; &lt;p class="encadre-titre"&gt;&#10; &#10; &#10; &lt;svg aria-hidden="true" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M9 18h6"/&gt;&lt;path d="M10 22h4"/&gt;&lt;path d="M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.1V17h6v-.2c0-.8.4-1.6 1-2.1A7 7 0 0 0 12 2z"/&gt;&lt;/svg&gt;&#10; &#10; &lt;span&gt;Un port ouvert ne prouve qu&amp;#39;une chose&lt;/span&gt;&#10; &lt;/p&gt;&#10; &#10; &lt;div class="encadre-contenu"&gt;&#10; &lt;p&gt;« Le port répond » valide la couche réseau, et rien d&amp;rsquo;autre. Il faut&#10;tester chaque couche : la connexion TCP, puis le service (sa bannière),&#10;puis l&amp;rsquo;authentification.&lt;/p&gt;&#10;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&#10;&lt;h2 id="le-détail-qui-ma-fait-comprendre-la-nat-de-docker"&gt;Le détail qui m&amp;rsquo;a fait comprendre la NAT de Docker&lt;/h2&gt;&#10;&lt;p&gt;En configurant les deux connexions, j&amp;rsquo;ai remarqué que les cibles ne&#10;voyaient pas arriver la même adresse :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;vers le serveur lui-même&lt;/strong&gt;, &lt;code&gt;sshd&lt;/code&gt; voyait l&amp;rsquo;adresse &lt;strong&gt;interne&lt;/strong&gt; du&#10;conteneur &lt;code&gt;guacd&lt;/code&gt;. J&amp;rsquo;ai donc limité la clé SSH de Guacamole aux réseaux&#10;internes de Docker (option &lt;code&gt;from=&lt;/code&gt; dans &lt;code&gt;authorized_keys&lt;/code&gt;) ;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;vers le PC&lt;/strong&gt;, TightVNC voyait l&amp;rsquo;adresse &lt;strong&gt;du serveur&lt;/strong&gt; : en sortant vers&#10;le réseau local, Docker remplace l&amp;rsquo;adresse du conteneur par celle de&#10;l&amp;rsquo;hôte (c&amp;rsquo;est de la NAT). La règle de TightVNC autorise donc le serveur.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Comprendre ce comportement était indispensable pour écrire des règles&#10;d&amp;rsquo;accès qui marchent, et qui restent strictes.&lt;/p&gt;&#10;&lt;h2 id="ce-que-jen-retiens"&gt;Ce que j&amp;rsquo;en retiens&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Lire les journaux des deux côtés.&lt;/strong&gt; Le client dit ce qu&amp;rsquo;il a tenté ; le&#10;serveur dit pourquoi il a refusé. Pour SSH comme pour VNC, c&amp;rsquo;est le&#10;serveur qui a donné la cause.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Tester couche par couche&lt;/strong&gt;, du réseau à l&amp;rsquo;authentification, au lieu de&#10;tout changer en même temps.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Un bloc de clé se copie en entier&lt;/strong&gt;, lignes BEGIN et END comprises.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Les outils de diagnostic sont temporaires&lt;/strong&gt; : niveau de journalisation&#10;maximal, conteneurs de test… tout a été retiré une fois la cause trouvée.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>Mon coffre de mots de passe ne répondait plus, et le réseau n'y était pour rien</title><link>https://journal.ange-bonkoski.fr/journal/le-reseau-n-y-etait-pour-rien/</link><pubDate>Mon, 19 Oct 2026 09:00:00 +0200</pubDate><guid>https://journal.ange-bonkoski.fr/journal/le-reseau-n-y-etait-pour-rien/</guid><category>homelab</category><category>vaultwarden</category><category>docker</category><category>diagnostic</category><description>&lt;p&gt;Le 20 septembre, mon gestionnaire de mots de passe auto-hébergé a&#10;cessé de fonctionner… à moitié. Le coffre s&amp;rsquo;ouvrait parfaitement dans le&#10;navigateur. Mais l&amp;rsquo;extension Firefox affichait une erreur obscure, et&#10;l&amp;rsquo;application iPhone refusait de se connecter.&lt;/p&gt;&#10;&lt;p&gt;J&amp;rsquo;ai passé des heures à chercher dans la mauvaise direction. Cet article&#10;raconte comment j&amp;rsquo;en suis sorti, et surtout la petite expérience qui a&#10;tout débloqué.&lt;/p&gt;&#10;&lt;h2 id="le-contexte"&gt;Le contexte&lt;/h2&gt;&#10;&lt;p&gt;J&amp;rsquo;héberge &lt;strong&gt;Vaultwarden&lt;/strong&gt; sur mon serveur maison. C&amp;rsquo;est une réécriture&#10;légère du serveur de &lt;strong&gt;Bitwarden&lt;/strong&gt; : on garde les applications officielles&#10;de Bitwarden (extension, application mobile), mais elles parlent à mon&#10;serveur plutôt qu&amp;rsquo;à celui de l&amp;rsquo;éditeur.&lt;/p&gt;&#10;&lt;p&gt;À l&amp;rsquo;époque, le trafic passait par Cloudflare, puis par un reverse proxy,&#10;avant d&amp;rsquo;arriver au conteneur.&lt;/p&gt;&#10;&lt;h2 id="le-symptôme"&gt;Le symptôme&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Le coffre web&lt;/strong&gt; : fonctionne.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;L&amp;rsquo;extension Firefox&lt;/strong&gt; : &lt;code&gt;KDF config response does not contain a valid KDF type&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;L&amp;rsquo;application iOS&lt;/strong&gt; : « Nous ne sommes pas en mesure de traiter votre demande ».&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Le KDF (&lt;em&gt;key derivation function&lt;/em&gt;) est la fonction qui transforme le mot de&#10;passe maître en clé de chiffrement. Le client demande au serveur quels&#10;paramètres utiliser, puis fait le calcul lui-même. L&amp;rsquo;erreur disait donc :&#10;« la réponse du serveur ne ressemble pas à ce que j&amp;rsquo;attends ».&lt;/p&gt;&#10;&lt;h2 id="pourquoi-jai-accusé-le-réseau"&gt;Pourquoi j&amp;rsquo;ai accusé le réseau&lt;/h2&gt;&#10;&lt;p&gt;Ma première intuition : quelque chose entre le client et le serveur&#10;abîmait la réponse. C&amp;rsquo;était plausible, car proxys et CDN modifient parfois&#10;le trafic au passage. J&amp;rsquo;ai donc testé, une par une :&lt;/p&gt;&#10;&#10;&lt;div class="tableau" role="region" aria-label="Tableau" tabindex="0"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th class="aligne-left"&gt;Piste testée&lt;/th&gt;&#10; &lt;th class="aligne-left"&gt;Résultat&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td class="aligne-left"&gt;Désactiver les protections anti-robots de Cloudflare&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;Aucun effet&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td class="aligne-left"&gt;Règle de pare-feu applicatif pour laisser tout passer&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;Aucun effet&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td class="aligne-left"&gt;Purger le cache Cloudflare&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;Aucun effet&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td class="aligne-left"&gt;Désactiver HTTP/3 et le 0-RTT&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;Aucun effet&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td class="aligne-left"&gt;Vérifier la compression de la réponse&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;JSON propre une fois décompressé&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td class="aligne-left"&gt;Corriger l&amp;rsquo;adresse publique déclarée dans la configuration&lt;/td&gt;&#10; &lt;td class="aligne-left"&gt;Vrai défaut, mais pas suffisant&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Chaque test prenait du temps, et aucun ne changeait rien.&lt;/p&gt;&#10;&lt;h2 id="le-friend-test"&gt;Le &lt;em&gt;friend test&lt;/em&gt;&lt;/h2&gt;&#10;&lt;p&gt;J&amp;rsquo;ai fini par emprunter le téléphone d&amp;rsquo;un proche. Il n&amp;rsquo;avait jamais été&#10;connecté à mon réseau, ni à mon compte iCloud, ni à mon Firefox. J&amp;rsquo;y ai&#10;installé l&amp;rsquo;application Bitwarden, je l&amp;rsquo;ai pointée vers mon serveur…&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Même erreur, exactement.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Ce test a éliminé d&amp;rsquo;un coup toutes mes hypothèses réseau. Un problème&#10;propre à mon infrastructure, à mon cache ou à mes appareils n&amp;rsquo;aurait pas&#10;touché un téléphone neuf. Le problème venait de ce que &lt;strong&gt;tous&lt;/strong&gt; les clients&#10;avaient en commun : la version de l&amp;rsquo;application.&lt;/p&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&lt;div class="encadre encadre-lecon" role="note"&gt;&#10; &lt;p class="encadre-titre"&gt;&#10; &#10; &#10; &lt;svg aria-hidden="true" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M9 18h6"/&gt;&lt;path d="M10 22h4"/&gt;&lt;path d="M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.1V17h6v-.2c0-.8.4-1.6 1-2.1A7 7 0 0 0 12 2z"/&gt;&lt;/svg&gt;&#10; &#10; &lt;span&gt;Le friend test&lt;/span&gt;&#10; &lt;/p&gt;&#10; &#10; &lt;div class="encadre-contenu"&gt;&#10; &lt;p&gt;Quand tout semble suspect, reproduisez le problème sur un appareil qui ne&#10;partage &lt;strong&gt;rien&lt;/strong&gt; avec les vôtres. S&amp;rsquo;il plante pareil, ce n&amp;rsquo;est ni votre&#10;réseau, ni votre configuration locale.&lt;/p&gt;&#10;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&#10;&lt;h2 id="la-vraie-cause--un-contrat-de-version-rompu"&gt;La vraie cause : un contrat de version rompu&lt;/h2&gt;&#10;&lt;p&gt;Pourquoi le coffre web, lui, fonctionnait-il ? Parce que Vaultwarden sert&#10;&lt;strong&gt;sa propre&lt;/strong&gt; interface web, compilée avec lui, à la même version. Elle&#10;comprend forcément ses réponses. C&amp;rsquo;était le pire témoin possible.&lt;/p&gt;&#10;&lt;p&gt;L&amp;rsquo;extension et l&amp;rsquo;application, elles, sont publiées par Bitwarden et mises à&#10;jour automatiquement par les magasins d&amp;rsquo;applications, sans aucun lien avec&#10;mon serveur. Bitwarden avait fait évoluer la structure de la réponse KDF.&#10;Les clients avaient adopté le nouveau format ; mon serveur ne le parlait&#10;pas encore. Il fallait une version plus récente de Vaultwarden.&lt;/p&gt;&#10;&lt;h2 id="pourquoi-la-mise-à-jour-na-pas-marché-du-premier-coup"&gt;Pourquoi la mise à jour n&amp;rsquo;a pas marché du premier coup&lt;/h2&gt;&#10;&lt;p&gt;J&amp;rsquo;ai lancé la mise à jour du conteneur… et rien n&amp;rsquo;a changé. En relisant&#10;mon fichier Compose, j&amp;rsquo;ai trouvé ceci :&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;vaultwarden/server:1.36.0@sha256:&amp;lt;empreinte&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Docker peut désigner une image de deux façons :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;par une &lt;strong&gt;étiquette&lt;/strong&gt; (&lt;code&gt;1.36.0&lt;/code&gt;, &lt;code&gt;latest&lt;/code&gt;) : un nom qui peut pointer vers&#10;une autre image demain ;&lt;/li&gt;&#10;&lt;li&gt;par une &lt;strong&gt;empreinte&lt;/strong&gt; (&lt;code&gt;sha256:…&lt;/code&gt;) : l&amp;rsquo;identifiant exact d&amp;rsquo;une image,&#10;qui ne change jamais.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Quand les deux sont présentes, &lt;strong&gt;l&amp;rsquo;empreinte l&amp;rsquo;emporte&lt;/strong&gt;. J&amp;rsquo;avais beau&#10;télécharger de nouvelles versions, Docker relançait toujours la même image&#10;figée. Une fois l&amp;rsquo;empreinte retirée et une version récente demandée,&#10;l&amp;rsquo;extension et l&amp;rsquo;application se sont reconnectées immédiatement.&lt;/p&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&#10;&lt;div class="encadre encadre-attention" role="note"&gt;&#10; &lt;p class="encadre-titre"&gt;&#10; &#10; &#10; &lt;svg aria-hidden="true" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;&lt;path d="M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z"/&gt;&lt;path d="M12 9v4"/&gt;&lt;path d="M12 17h.01"/&gt;&lt;/svg&gt;&#10; &#10; &lt;span&gt;Épingler n&amp;#39;est pas une erreur, l&amp;#39;oublier si&lt;/span&gt;&#10; &lt;/p&gt;&#10; &#10; &lt;div class="encadre-contenu"&gt;&#10; &lt;p&gt;Figer une image par son empreinte est une bonne pratique de sécurité : on&#10;sait exactement ce qui tourne. Le piège, c&amp;rsquo;est de l&amp;rsquo;avoir fait sans s&amp;rsquo;en&#10;souvenir. Depuis, chaque service a une politique d&amp;rsquo;image écrite : figé (et&#10;mis à jour à la main) ou suivi automatiquement.&lt;/p&gt;&#10;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&#10;&#10;&lt;h2 id="ce-que-jen-retiens"&gt;Ce que j&amp;rsquo;en retiens&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Vérifier la compatibilité client/serveur avant de chercher dans le&#10;réseau.&lt;/strong&gt; Quand des clients mis à jour automatiquement cassent, la version&#10;est le premier suspect.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Choisir un bon témoin.&lt;/strong&gt; Un client livré avec le serveur ne prouve rien&#10;sur les autres.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Lire le fichier réel avant de mettre à jour.&lt;/strong&gt; Ce que je croyais avoir&#10;configuré et ce qui était écrit n&amp;rsquo;étaient pas la même chose.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Changer une seule chose à la fois.&lt;/strong&gt; C&amp;rsquo;est ce qui m&amp;rsquo;a permis de repérer&#10;le seul vrai défaut parmi mes essais.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>