Chatkontrol er ikke et teoretisk problem længere. Selvom et flertal i Europa-Parlamentet stemte nej til den mest vidtgående version, er forslaget om obligatorisk scanning af private beskeder stadig i spil i Rådet, og den underliggende teknologi (client-side scanning) findes allerede i kommercielle produkter. Denne guide viser dig, hvordan du på cirka 60 minutter bygger en kommunikationsopsætning, der gør dine private samtaler langt sværere at masseaflæse, uanset hvordan den endelige forordning ender.

Vi bygger en konkret, fungerende stak: hærdet Signal, SimpleX Chat uden identifikatorer, og din egen Matrix-homeserver (Synapse) i Docker med ende-til-ende-kryptering slået til som standard. Du får 12 trin, mere end 5 kodeblokke, output-eksempler, en lang fejlfindingssektion og avancerede tips. Alt er skrevet, så en teknisk interesseret bruger i Danmark eller Norden kan følge med uden at være systemadministrator til daglig.

Vigtigt at slå fast med det samme: ende-til-ende-kryptering beskytter dine beskeder, mens de er undervejs, men chatkontrol handler om at scanne indholdet på din enhed, før det krypteres. Derfor er svaret ikke ét enkelt værktøj, men en kombination af apps, der minimerer metadata, undgår usikre sky-backups og giver dig kontrol over serveren. Lad os komme i gang.

Hvad er chatkontrol, og hvor står sagen i 2026?

Chatkontrol er kælenavnet på EU’s forordning mod seksuelt misbrug af børn, formelt CSA-forordningen (CSAR). Europa-Kommissionen fremlagde forslaget 11. maj 2022. Kernen i kritikken har hele tiden været den samme: forslaget åbnede for, at udbydere af beskedtjenester skulle pålægges at scanne private kommunikation, også i krypterede tjenester, for kendt og ukendt misbrugsmateriale samt grooming.

I efteråret 2025 nåede modstanden et historisk niveau. En afstemning, der var planlagt til 13. eller 14. oktober 2025, blev trukket, fordi medlemslandene ikke kunne samle flertal. Det danske formandskab, der overtog roret i juli 2025, gjorde CSA-forordningen til en højt prioriteret sag og forhandlede i november 2025 en fælles rådsposition på plads efter års dødvande. I den version blev det direkte krav om at scanne beskeder (inklusive krypterede) ifølge flere kilder fjernet, og teksten lænede sig i stedet op ad “alle rimelige afbødende foranstaltninger” og frivillig detektion.

Privatlivsorganisationer som EFF og EDRi advarer dog om, at formuleringer om risikoafbødning og aldersverifikation kan skabe et indirekte pres for scanning på enhederne. Samtidig blev den midlertidige ePrivacy-undtagelse, der tillod frivillig detektion, forlænget til 3. april 2026, og Kommissionen foreslog 19. december 2025 en yderligere forlængelse på to år. Med andre ord: sagen er ikke afgjort, teknologien forsvinder ikke, og din bedste forsikring er en opsætning, der ikke er afhængig af lovgivernes næste kompromis. Læs mere om den politiske status i vores nyhedsdækning af chatkontrol-afstemningen i EU-Parlamentet.

DatoBegivenhedBetydning for dig
11. maj 2022Kommissionen fremlægger CSA-forslagetStartskuddet for chatkontrol-debatten
Juli 2025Dansk EU-formandskab prioriterer sagenDanmark står centralt i forhandlingen
Okt. 2025Planlagt afstemning trækkesManglende flertal blandt medlemslande
Nov. 2025Rådet vedtager fælles positionDirekte beskedscanning fjernet, afbødning tilbage
19. dec. 2025Forslag om 2-årig forlængelseFrivillig detektion fortsætter i en periode
3. apr. 2026ePrivacy-undtagelse udløberFrivillig scanning kræver ny hjemmel

Sådan fungerer client-side scanning teknisk

For at bygge et fornuftigt forsvar skal du forstå angrebsfladen. Client-side scanning (CSS) betyder, at indholdet kontrolleres på din egen telefon eller computer, før det sendes, eller idet det vises. Teknikken bruger typisk perceptuel hashing (for eksempel algoritmer i stil med PhotoDNA), hvor et billede omdannes til et fingeraftryk, der kan sammenlignes med en database af kendt materiale, samt maskinlæringsklassifikatorer, der forsøger at genkende nyt materiale eller grooming-mønstre i tekst.

Det centrale problem er rækkefølgen. Ende-til-ende-kryptering sikrer, at kun afsender og modtager kan læse beskeden i transit. Men CSS griber ind før krypteringen sker, altså mens teksten eller billedet stadig ligger i klartekst i appen. Derfor er udsagnet “Signal er krypteret, så jeg er beskyttet” kun halvt rigtigt. Krypteringen beskytter mod serverside-scanning og aflytning på netværket, men ikke automatisk mod kode, der kører på selve enheden.

Dit forsvar hviler derfor på tre principper, som hele denne guide er bygget op om:

  • Minimér klartekst på enheden: Brug apps, der ikke synkroniserer beskeder til usikre sky-backups, og som ikke kræver, at du afleverer indholdet til en tredjepart.
  • Minimér metadata: Selv hvis indholdet er krypteret, afslører hvem-taler-med-hvem og hvornår en hel del. Vælg tjenester, der reducerer identifikatorer.
  • Kontrollér infrastrukturen: Når du selv driver serveren, bestemmer du opdateringer, logning og hvilken kode der kører. Ingen ekstern udbyder kan tvinges til at indføre scanning på dine vegne uden din viden.

Med de principper på plads kan vi sammenligne de værktøjer, vi bruger i projektet. Tabellen nedenfor opsummerer, hvorfor hver app indgår, og hvad den bidrager med mod chatkontrol.

App/tjenesteTypeIdentifikatorStyrke mod client-side scanning
SignalBeskedappTelefonnummerStærk E2EE og lille metadata-aftryk, men endpoint kan rammes ved lovkrav
SimpleX ChatBeskedappIngen (intet bruger-ID)Undgår vedvarende identifikatorer, gør korrelation svær
Matrix (Synapse)Selvhostet protokol@bruger:dit-domæneDu styrer serveren, E2EE kan tvinges til standard
SessionBeskedappPseudonymt IDDecentral routing reducerer netværksovervågning
BriarP2P-beskedappIngen central serverIngen central server at presse til scanning
Proton Mail / TutaKrypteret e-mailE-mailadresseBegrænset serverside-indsigt i indhold

Forudsætninger: software og versioner

Projektet kræver en lille Linux-server (en VPS hos en europæisk udbyder eller en maskine derhjemme), en telefon og lidt tålmodighed. Brug seneste stabile versioner af alt, men herunder er de minimumsversioner, opsætningen er testet med. Tjek altid den officielle dokumentation for nyeste version, da tallene ændrer sig løbende.

KomponentMinimumsversionFormål
Ubuntu Server (LTS)22.04 eller 24.04Værtsoperativsystem til serveren
Docker Engineseneste stabileKører Synapse i en container
Docker Composev2 (plugin)Orkestrerer containere
Caddyseneste stabileReverse proxy med automatisk TLS
Matrix Synapseseneste stabile (image)Din homeserver
Elementseneste app-versionMatrix-klient til telefon og web
Signalseneste app-versionHærdet beskedapp
SimpleX Chatseneste app-versionBeskedapp uden identifikatorer
exiftoolseneste stabileFjerner metadata fra filer

Du skal også bruge et domænenavn, du styrer (for eksempel chat.ditdomaene.dk), og adgang til at oprette DNS-poster. Hvis du vil holde alt i Norden, vælger du en udbyder med datacentre i Danmark, Sverige eller Finland. Det ændrer ikke krypteringen, men det holder metadata og jurisdiktion tæt på dig. For en bredere diskussion om at flytte væk fra amerikansk infrastruktur, se vores artikel om digital suverænitet i Danmark.

Trin 1: Byg din trusselsmodel

Spring ikke dette trin over. En trusselsmodel er en kort, ærlig beskrivelse af, hvad du beskytter, mod hvem, og hvor meget besvær du er villig til at acceptere. Uden den ender du enten med falsk tryghed eller med en opsætning, der er så besværlig, at du holder op med at bruge den. Skriv tre linjer ned, før du rører ved teknikken.

  • Aktiver: Hvilke samtaler er følsomme? Kildebeskyttelse for en journalist, helbredsoplysninger, fagforeningsarbejde, eller bare et ønske om at private samtaler forbliver private.
  • Modstander: Mod automatiseret masseaflæsning (chatkontrol-scenariet) er forsvaret anderledes end mod en målrettet statsaktør med adgang til zero-days. De fleste læsere her vil beskytte sig mod det første.
  • Omkostning: Hvor meget bøvl tåler dine modtagere? Det nytter ikke at hoste din egen Matrix-server, hvis familien nægter at installere Element.

For chatkontrol-scenariet er den realistiske modstander automatiseret scanning på enheds- eller platformsniveau, ikke en målrettet hacker. Det betyder, at du primært skal vælge tjenester, der ikke afleverer indholdet til en scanbar tredjepart, og som minimerer metadata. Den indsigt former resten af projektet. Et godt supplement er en gennemtænkt adgangskodepraksis, som vi gennemgår i guiden om en selvhostet password manager med Vaultwarden.

Trin 2: Lås Signal og verificer sikkerhedsnumre

Signal er udgangspunktet, fordi det er let at få modtagere med på, og fordi protokollen har et lille metadata-aftryk. Men en standardinstallation er ikke nok. Du skal verificere sikkerhedsnumre, slå skylagring fra og begrænse, hvad der lander på låseskærmen. Begynd med at installere appen fra det officielle kildested og opdater til seneste version.

Det vigtigste enkelttrin er verifikation. Når du åbner en samtale, kan du trykke på kontaktens navn og derefter “Vis sikkerhedsnummer”. To enheder, der har den samme 60-cifrede kode (eller scanner hinandens QR), har en uafbrudt krypteringskanal. Gør det i virkeligheden, ikke over en kanal, der selv kan være kompromitteret. Når det er gjort, slår du “Vis verificeret” til, så du får besked, hvis nøglen ændrer sig.

  • Slå registreringslås til (Indstillinger, Konto, Registreringslås), så ingen kan kapre dit nummer uden din PIN.
  • Aktivér forsvindende beskeder som standard, for eksempel 4 uger, så gammel klartekst ikke hober sig op på enheden.
  • Slå skærmlås til og fjern beskedindhold fra notifikationer (Indstillinger, Notifikationer, Vis, “Ingen navn eller besked”).
  • Deaktiver sky-backup på iOS (Signal gemmer ikke i iCloud som standard) og brug Signals egen krypterede backup på Android med en stærk kode.

Hvis du vil automatisere afsendelse eller verificere opsætningen fra en server, kan du bruge signal-cli. Eksemplet herunder viser, hvordan du lister dine registrerede identiteter og deres tillidsstatus.

# Installer signal-cli (kraever Java 21+) og list identiteter
signal-cli -a +45XXXXXXXX listIdentities

# Eksempel paa output:
# Number: +4520123456 Added: 2026-02-11
#   Fingerprint: 05 a1 9c ... (60 hex)
#   Safety Number: 12345 67890 ...
#   Trust: TRUSTED_VERIFIED

Statussen TRUSTED_VERIFIED er målet. Står der TRUSTED_UNVERIFIED, har du ikke bekræftet sikkerhedsnummeret endnu. Signal alene løser ikke chatkontrol-problemet, fordi appen stadig viser klartekst på enheden, men med disse indstillinger har du fjernet de nemmeste angrebsflader.

Trin 3: Tag SimpleX Chat i brug uden identifikatorer

SimpleX Chat er interessant netop i chatkontrol-sammenhæng, fordi det er bygget uden vedvarende bruger-id. Der er ingen telefonnummer, ingen e-mail og intet centralt brugerregister. Du deler i stedet et engangs-invitationslink eller en QR-kode, og forbindelsen etableres via midlertidige beskedkøer på relæservere. Det gør platformsdækkende korrelation (hvem taler med hvem) markant sværere.

Installer SimpleX Chat på din telefon, og opret en profil. Læg mærke til, at “profilen” kun findes lokalt på din enhed. For at tilføje en kontakt vælger du “Tilføj kontakt” og deler det genererede link med personen via en kanal, du allerede stoler på. Når forbindelsen er oprettet, kan invitationen ikke genbruges, hvilket forhindrer, at en tredjepart sniger sig ind på samme link.

  • Opret separate profiler til forskellige kontekster (arbejde, familie, kilder), så de ikke kan kædes sammen.
  • Aktivér SimpleX Lock med adgangskode eller biometri.
  • Overvej at køre dit eget SMP-relæ, hvis du vil have fuld kontrol over routinglaget (mere herom i avancerede tips).
  • Slå “slet beskeder” til efter en periode, så enheden ikke ophober klartekst.

Det er værd at gentage en nøgtern pointe: ingen app er immun over for kode, der tvinges til at køre på selve enheden. SimpleX’ styrke er, at det fjerner de identifikatorer, som masseovervågning hænger sammen på. Det gør appen til et stærkt supplement til Signal og din egen Matrix-server, ikke et mirakelmiddel i sig selv.

Trin 4: Forbered serveren til din egen Matrix-homeserver

Nu kommer projektets kerne: din egen Matrix-homeserver med Synapse. Når du selv driver serveren, er der ingen ekstern udbyder, der kan pålægges at indføre scanning på dine beskeder uden din viden. Begynd med en frisk Ubuntu-server. Log ind via SSH og opdater systemet, opret en bruger uden root-privilegier og åbn de nødvendige porte i firewallen.

# Opdater systemet og installer grundpakker
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl ufw

# Installer Docker (officielt convenience-script)
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER   # log ud og ind igen bagefter

# Aabn kun de noedvendige porte
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8448/tcp        # Matrix-foederation
sudo ufw enable
sudo ufw status verbose

Opret derefter en DNS A-post, der peger chat.ditdomaene.dk mod serverens offentlige IP. For at klienter kan finde din homeserver via den korte adresse, tilføjer du en .well-known-fil senere. Tjek, at DNS er slået igennem, før du går videre, ellers fejler TLS-udstedelsen i Trin 6.

# Bekraeft at DNS peger korrekt
dig +short chat.ditdomaene.dk
# Forventet output: serverens offentlige IPv4-adresse, fx 203.0.113.42

Et hærdet udgangspunkt på serversiden er afgørende. Sørg for, at SSH bruger nøglebaseret login og ikke adgangskode, og hold systemet opdateret. Norden er et yndet mål for cyberangreb, og en dårligt sikret server underminerer hele øvelsen. Se vores oversigt over cybertrusler i Norden i 2026 for kontekst.

Trin 5: Konfigurer Synapse med E2EE som standard

Vi kører Synapse i Docker, så opgraderinger og isolation bliver enkle. Opret en mappe til projektet og generér en grundkonfiguration. Generatoren laver en homeserver.yaml, som vi derefter tilpasser, så ende-til-ende-kryptering er slået til som standard for alle nye rum.

mkdir -p ~/matrix/data && cd ~/matrix

# Generer grundkonfiguration (engangskommando)
docker run -it --rm \
  -v ~/matrix/data:/data \
  -e SYNAPSE_SERVER_NAME=chat.ditdomaene.dk \
  -e SYNAPSE_REPORT_STATS=no \
  matrixdotorg/synapse:latest generate

# Filerne homeserver.yaml og signing.key ligger nu i ~/matrix/data

Åbn ~/matrix/data/homeserver.yaml og tilføj eller ret følgende felter. Det vigtigste er encryption_enabled_by_default_for_room_type: all, som sikrer, at alle nye rum er krypterede fra start. Vi lukker også for åben registrering, så fremmede ikke kan oprette konti på din server.

# Uddrag af homeserver.yaml
server_name: "chat.ditdomaene.dk"

# Tving E2EE for alle nye rum
encryption_enabled_by_default_for_room_type: all

# Luk for aaben registrering, brug i stedet token eller manuel oprettelse
enable_registration: false
registration_requires_token: true

# Begraens hvad der logges, og hvor laenge
redaction_retention_period: 7d
user_ips_max_age: 14d

# Foederation: tillad kun de servere du oensker (valgfrit, men anbefales)
# federation_domain_whitelist:
#   - ditdomaene.dk

Bemærk, at Synapse krypterer beskedindhold mellem klienter, men serveren håndterer stadig metadata (hvem er i hvilke rum, tidsstempler). Derfor lukker vi for åben registrering og begrænser logning. Hvis du vil isolere serveren helt, kan du bruge federation_domain_whitelist til kun at tale med udvalgte domæner, men det afskærer dig fra resten af Matrix-netværket. For de fleste er fuld føderation med E2EE et fornuftigt kompromis.

Trin 6: Sæt TLS og reverse proxy op med Caddy

Synapse bør aldrig eksponeres direkte mod internettet uden TLS. Vi bruger Caddy som reverse proxy, fordi den henter og fornyer Let’s Encrypt-certifikater automatisk. Opret en docker-compose.yml, der kører både Synapse og Caddy i samme netværk. Det er projektets centrale fil, så gennemgå den linje for linje.

# ~/matrix/docker-compose.yml
services:
  synapse:
    image: matrixdotorg/synapse:latest
    restart: unless-stopped
    volumes:
      - ./data:/data
    networks:
      - matrixnet

  caddy:
    image: caddy:latest
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "8448:8448"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
    networks:
      - matrixnet

networks:
  matrixnet:

volumes:
  caddy_data:

Opret derefter en Caddyfile ved siden af compose-filen. Den terminerer TLS, sender klient-API’et videre til Synapse og udstiller .well-known-filerne, så korte Matrix-adresser virker.

# ~/matrix/Caddyfile
chat.ditdomaene.dk {
    reverse_proxy /_matrix/* synapse:8008
    reverse_proxy /_synapse/client/* synapse:8008

    handle /.well-known/matrix/server {
        header Content-Type application/json
        respond `{"m.server": "chat.ditdomaene.dk:443"}`
    }
    handle /.well-known/matrix/client {
        header Content-Type application/json
        header Access-Control-Allow-Origin *
        respond `{"m.homeserver": {"base_url": "https://chat.ditdomaene.dk"}}`
    }
}

Start nu hele stakken og følg loggen. Caddy henter certifikatet automatisk, første gang domænet rammes.

cd ~/matrix
docker compose up -d
docker compose logs -f caddy   # bekraeft TLS-udstedelse, tryk Ctrl+C for at stoppe

Trin 7: Opret bruger og log ind med Element

Serveren kører, men der er ingen brugere endnu. Fordi vi slog åben registrering fra, opretter vi den første konto manuelt inde i containeren. Det er den sikreste fremgangsmåde, fordi ingen kan oprette sig udefra.

# Opret den foerste bruger (interaktivt)
docker compose exec synapse register_new_matrix_user \
  -c /data/homeserver.yaml http://localhost:8008

# Du bliver spurgt om brugernavn, adgangskode og om brugeren skal vaere admin
# new user localpart [...]: sam
# password: ********
# make admin [no]: yes
# Sending registration request...
# Success!

Installer derefter Element på din telefon og i browseren. Vælg “Log ind”, tryk “Rediger” ved hjemmeserveren, og indtast https://chat.ditdomaene.dk. Log ind med brugeren, du lige oprettede. Den korte adresse @sam:chat.ditdomaene.dk virker, fordi .well-known-filen fra Trin 6 fortæller klienten, hvor serveren bor.

Test med det samme, at kryptering er slået til som standard: opret et nyt rum, og bekræft, at der står en hængelås, og at “Krypteret” er aktivt under rummets indstillinger. Hvis det ikke er tilfældet, gik encryption_enabled_by_default_for_room_type ikke igennem, og du bør gennemgå Trin 5 igen, før du inviterer andre.

Trin 8: Verificer enheder og krydssignering

E2EE i Matrix beskytter kun, hvis du verificerer dine enheder. Krydssignering (cross-signing) gør, at dine egne enheder stoler på hinanden, og at du kan verificere kontakter med en kort emoji-sammenligning i stedet for at sammenligne lange nøgler manuelt. Når du logger ind på en ny enhed, beder Element dig om at verificere den mod en eksisterende.

  • Log ind på Element i browseren, og verificer den mod telefonen ved at sammenligne de viste emojis.
  • Opret en sikker nøglebackup (Secure Backup) og gem gendannelsesnøglen et sikkert sted offline, for eksempel i din password manager.
  • Verificer hver ny kontakt første gang ved at sammenligne emojis i et videoopkald eller fysisk møde.
  • Hold øje med advarsler om “uverificerede sessioner” i rum, det betyder, at en deltager har en enhed, du ikke har bekræftet.

Gendannelsesnøglen er kritisk. Mister du den, og logger du ud af alle enheder, kan krypterede beskeder ikke gendannes. Det er prisen for, at serveren ikke kan læse dem. Skriv nøglen ned, og opbevar den adskilt fra dine enheder. Den disciplin er den samme, vi anbefaler for seed-sætninger og andre kryptografiske hemmeligheder.

Trin 9: Slå usikre sky-backups fra

Her falder de fleste opsætninger. Det nytter ikke at kryptere alt i transit, hvis hele din beskedhistorik samtidig synkroniseres ukrypteret til en sky-backup, som en tredjepart kan scanne eller udleveres til myndigheder. Dette trin handler om at lukke den bagdør på alle platforme.

  • iOS: Slå iCloud-backup fra for apps, der gemmer beskeder ukrypteret. I Indstillinger, dit navn, iCloud, gennemgå hvilke apps der har adgang. Vær særligt opmærksom på e-mail og fotoruller.
  • Android: Slå Google-backup fra for følsomme apps (Indstillinger, System, Backup), og undgå at synkronisere chat-mapper til Google Drev.
  • WhatsApp-fælden: WhatsApp er E2EE i transit, men chat-backup til iCloud eller Google Drev er ikke krypteret med din nøgle som standard. Slå “Ende-til-ende-krypteret backup” til, eller deaktiver backup helt.
  • Fotos: Billeder, du sender, er ofte det, client-side scanning er målrettet mod. Undgå automatisk skyupload af kamerarullen, hvis indholdet er følsomt.

For e-mail er princippet det samme. Vælg en udbyder, der krypterer på serversiden, så indholdet ikke ligger scanbart i en datacentral. Vi har sammenlignet to af de bedste i Norden i artiklen Proton Mail vs Tutanota. Pointen er ikke, at e-mail bliver immun, men at du fjerner den nemmeste vej til masseaflæsning af dit indhold.

Trin 10: Fjern metadata fra filer før afsendelse

Selv i en krypteret samtale kan filer afsløre mere, end du tror. Et foto fra en telefon indeholder ofte GPS-koordinater, tidsstempel, enhedsmodel og mere i EXIF-data. Modtageren (eller enhver, der senere får fat i filen) kan læse det hele. Brug exiftool til at strippe metadata, før du sender følsomme filer.

# Installer exiftool
sudo apt install -y libimage-exiftool-perl   # Debian/Ubuntu

# Se hvilke metadata en fil indeholder
exiftool foto.jpg

# Fjern ALLE metadata (laver foto.jpg_original som backup)
exiftool -all= foto.jpg

# Bekraeft at metadata er vaek
exiftool foto.jpg
# Forventet: kun grundlaeggende felter som filstoerrelse og billedmaal

For mange filer på én gang kan du køre exiftool -all= -r . i en mappe. På telefonen kan apps som ObscuraCam eller indbyggede “fjern placering”-funktioner gøre det samme, før du deler. Gør det til en vane: metadata er den del af et billede, som kryptering ikke skjuler for den, der modtager filen.

Trin 11: Test hele stakken

Nu samler vi det hele og verificerer, at det virker. En opsætning, du ikke har testet, er ikke en opsætning, du kan stole på. Kør disse fire kontroller, før du erklærer projektet færdigt.

1. Tjek at homeserveren svarer korrekt. Matrix har en offentlig føderationstester, men du kan også verificere lokalt med curl.

# Klient-API skal svare med serverens versioner
curl -s https://chat.ditdomaene.dk/_matrix/client/versions | head

# .well-known skal pege paa din server
curl -s https://chat.ditdomaene.dk/.well-known/matrix/client
# Forventet: {"m.homeserver": {"base_url": "https://chat.ditdomaene.dk"}}

2. Send en krypteret testbesked. Opret et rum i Element, inviter din anden enhed, og send en besked. Bekræft hængelåsen og at sessionen er verificeret.

3. Bekræft at SimpleX og Signal er hærdet. Gå listen fra Trin 2 og Trin 3 igennem: verificerede sikkerhedsnumre, forsvindende beskeder, ingen sky-backup.

4. Stress-test metadata. Send et foto gennem hver kanal, hent det ned på modtagerens enhed, og kør exiftool på det for at bekræfte, at metadata er væk. Output skal se sådan ud:

$ exiftool modtaget-foto.jpg
ExifTool Version Number  : 12.xx
File Name                : modtaget-foto.jpg
File Size                : 412 kB
Image Width              : 1920
Image Height             : 1080
# Ingen GPS, ingen enhedsmodel, intet tidsstempel = bestaaet

Trin 12: Automatiser opdateringer og overvågning

En server, der ikke opdateres, bliver en risiko. Synapse og Caddy får jævnligt sikkerhedsrettelser, og du vil ikke logge ind manuelt hver uge. Sæt automatiske opdateringer op med en simpel cron-opgave, og overvåg, at containerne kører.

# Opdateringsscript: ~/matrix/update.sh
#!/bin/sh
cd /home/sam/matrix
docker compose pull
docker compose up -d
docker image prune -f

# Goer det eksekverbart og koer ugentligt via cron
chmod +x ~/matrix/update.sh
crontab -l | { cat; echo "0 4 * * 0 /home/sam/matrix/update.sh >> /home/sam/matrix/update.log 2>&1"; } | crontab -

Overvej desuden at aktivere automatiske sikkerhedsopdateringer på selve værten med unattended-upgrades. Til overvågning er den enkleste løsning en sundhedstjek-kommando, du kan køre fra en anden maskine, eller en gratis uptime-tjeneste, der pinger din /_matrix/client/versions-endpoint. Med dette trin er din chatkontrol-resistente stak komplet, selvopdaterende og overvåget.

Almindelige faldgruber, du skal undgå

De fleste fejl i denne type opsætning handler ikke om kryptografi, men om menneskelige genveje. Her er de fem mest almindelige faldgruber, jeg ser igen og igen.

  • Glemte sky-backups: Du krypterer alt, men WhatsApp eller iCloud gemmer stille en ukrypteret kopi. Det er den hyppigste fejl og underminerer hele øvelsen. Gennemgå Trin 9 grundigt.
  • Uverificerede enheder: E2EE uden verifikation beskytter ikke mod en mand-i-midten. En uverificeret session i et Matrix-rum er en åben dør. Verificer altid.
  • Åben registrering på Synapse: Glemmer du enable_registration: false, kan fremmede oprette konti på din server og bruge den som relæ. Luk den med det samme.
  • Metadata-blindhed: Folk fokuserer på beskedindhold og glemmer, at hvem-hvornår-hvor ofte afslører lige så meget. Minimér identifikatorer og strip EXIF.
  • Single point of failure: Hvis al kommunikation kun ligger på din egen server, og den går ned, mister du adgang. Brug flere kanaler (Signal, SimpleX, Matrix) bevidst, så ét nedbrud ikke isolerer dig.

En sjette, mere subtil faldgrube er falsk tryghed. Ingen teknisk opsætning beskytter, hvis du sender følsomt indhold til en modtager, der ikke har samme disciplin. Sikkerhed er et fælles ansvar i en samtale, ikke kun din egen.

Fejlfinding: de 8 hyppigste problemer

Når noget ikke virker, er det næsten altid ét af problemerne herunder. Tabellen giver symptom, sandsynlig årsag og løsning.

SymptomSandsynlig årsagLøsning
Caddy får ikke TLS-certifikatDNS peger ikke på serveren, eller port 80 er lukketTjek dig +short og ufw status, vent på DNS-propagering
Element kan ikke finde homeserver.well-known mangler eller returnerer forkert JSONTest curl .../.well-known/matrix/client
register_new_matrix_user fejlerForkert sti til homeserver.yaml eller container ikke startetBrug docker compose exec synapse og fuld sti
Nye rum er ikke krypteredeencryption_enabled_by_default manglerRet homeserver.yaml, kør docker compose restart synapse
“Uverificeret session”-advarselKrydssignering ikke sat opVerificer enheden mod en eksisterende i Element
Føderation virker ikkePort 8448 lukket eller .well-known/server forkertÅbn 8448, test med Matrix Federation Tester
Signal viser TRUSTED_UNVERIFIEDSikkerhedsnummer ikke bekræftetSammenlign og marker som verificeret
Krypterede beskeder kan ikke læses på ny enhedManglende nøglebackup eller gendannelsesnøgleGendan via Secure Backup med gendannelsesnøglen

Et niende, tilbagevendende problem: efter en opdatering starter en container ikke. Kør docker compose logs synapse og læs de sidste linjer. Ni ud af ti gange skyldes det en syntaksfejl i homeserver.yaml (typisk indrykning med tabulator i stedet for mellemrum). YAML er nådesløst over for indrykning, så brug altid mellemrum.

Avancerede tips til den ekstra mil

Når grundopsætningen kører, er der flere måder at stramme den yderligere. Disse trin er ikke nødvendige for de fleste, men relevante, hvis din trusselsmodel er højere end gennemsnittet.

Kør dit eget SimpleX-relæ

SimpleX’ relæservere (SMP-servere) håndterer beskedkøerne. De kan ikke læse indholdet, men ved at køre dit eget relæ fjerner du afhængigheden af tredjepartsservere. Du installerer smp-server på en VPS, genererer en server-adresse og peger dine SimpleX-klienter mod den. Det er overkill for de fleste, men for en journalist med kildebeskyttelse er det en reel gevinst.

Brug Tor eller en VPN foran serveren

Metadata på netværkslaget (din IP, der forbinder til din server) kan afsløre, hvem du er. Ved at lægge en VPN eller en Tor-onion-service foran din Matrix-server skjuler du forbindelsens oprindelse. Element understøtter at forbinde via en onion-adresse. Læs vores praktiske Tor Browser-guide for at komme i gang med Tor-laget.

Lås metadata med stramme retentionsregler

Synapse gemmer som standard en del historik. Med retention-blokken i homeserver.yaml kan du sætte automatisk sletning af beskeder efter for eksempel 30 dage på serversiden. Kombineret med forsvindende beskeder i klienten betyder det, at selv et serverbrud kun afslører et smalt tidsvindue. Mindre data er mindre risiko.

Hvad chatkontrol betyder for din opsætning fremover

Selv hvis den nuværende CSA-forordning ender i en mild version, forsvinder presset for client-side scanning ikke. Argumentet vender tilbage med jævne mellemrum, og teknologien findes allerede. Den gode nyhed er, at den stak, du har bygget her, er robust over for de fleste fremtidige varianter, fordi den ikke afhænger af en enkelt udbyders velvilje.

Den vigtigste lære er principiel, ikke teknisk. Du har flyttet kontrollen fra eksterne platforme, der kan pålægges scanning, til værktøjer og en server, du selv styrer. Hold dig opdateret på lovgivningen via organisationer som EDRi og EFF, opdater din software, og verificer dine kontakter. Så er du forberedt på chatkontrol, uanset hvilken vej forhandlingerne i Bruxelles tager. Den danske debat følger vi løbende, blandt andet i forbindelse med danskernes ønske om digital suverænitet.

Hyppige spørgsmål om chatkontrol og kryptering

Er chatkontrol vedtaget i 2026?

Nej, ikke som en endelig forordning per midten af 2026. Rådet vedtog en fælles position i november 2025, hvor det direkte krav om beskedscanning blev fjernet, men forhandlingerne med Europa-Parlamentet er ikke afsluttet. Den midlertidige ePrivacy-undtagelse blev forlænget, og sagen er fortsat i bevægelse.

Beskytter Signal mig mod client-side scanning?

Signals ende-til-ende-kryptering beskytter mod aflytning på netværket og serverside-scanning, men ikke automatisk mod kode, der scanner indholdet på selve enheden, før det krypteres. Derfor kombinerer denne guide Signal med metadata-minimerende apps og din egen server, fremfor at stole på ét værktøj alene.

Hvorfor hoste min egen Matrix-server?

Når du selv driver serveren, kan ingen ekstern udbyder pålægges at indføre scanning på dine beskeder uden din viden. Du styrer opdateringer, logning og hvilken kode der kører. Det er den mest direkte måde at fjerne et tredjeparts-angrebspunkt i din kommunikation.

Er det lovligt at bruge krypteret kommunikation i Danmark?

Ja. Det er fuldt lovligt at bruge krypterede beskedtjenester og at hoste din egen server i Danmark og resten af EU. Hele formålet med chatkontrol-debatten er netop, om udbydere skal pålægges at scanne, ikke om borgere må kryptere. Privat kryptering er en almindelig og lovlig praksis.

Hvad er forskellen på SimpleX og Signal?

Signal bruger dit telefonnummer som identifikator og har et stort, modent økosystem. SimpleX Chat bruger slet ingen vedvarende bruger-id, hvilket gør platformsdækkende korrelation af hvem-taler-med-hvem markant sværere. De supplerer hinanden: Signal er nemt at få modtagere med på, SimpleX minimerer metadata mest.

Hvor lang tid tager opsætningen?

Regn med cirka 60 minutter for en, der er fortrolig med en terminal. Det meste af tiden går med at vente på DNS-propagering og TLS-udstedelse. Selve hærdningen af Signal og SimpleX tager under 15 minutter tilsammen.

Hjælper en VPN mod chatkontrol?

En VPN skjuler din IP og dermed noget netværksmetadata, men den beskytter ikke mod scanning, der sker i appen på din enhed. VPN er et nyttigt lag oven på de andre tiltag, ikke en erstatning for krypterede apps og en server, du kontrollerer.

Hvad sker der, hvis jeg mister min Matrix-gendannelsesnøgle?

Logger du ud af alle enheder uden gendannelsesnøglen, kan krypterede beskeder ikke gendannes. Det er prisen for, at serveren ikke kan læse dem. Gem nøglen offline, gerne i en password manager og på papir et sikkert sted.

Relateret læsning

Eksterne kilder

Denne guide er skrevet til oplysnings- og uddannelsesformål om privatliv og forsvarlig sikkerhed. Følg altid gældende lovgivning, og brug krypteret kommunikation ansvarligt.