# Gemini

## Hvad det er

Gemini er en applikationsprotokol til at hente dokumenter, hvor hele udvekslingen består af én
krypteret forbindelse, én adresse fra klienten og ét svar fra serveren, hvorefter forbindelsen
lukkes. Projektets egne dokumenter kalder den Gemini-protokollen; adresserne begynder med
`gemini://`, et site, der serveres over den, hedder en kapsel, og netværket af kapsler kaldes
Geminispace.

Projektet begyndte i juni 2019 under grundlæggeren Solderpunk, som stadig er dets »Benevolent
Dictator«. Specifikationen, version 0.24.1, er frigivet til det fælles domæne under CC0 og beskriver
protokollen som en gradvis forbedring af Gopher snarere end en afklædt udgave af HTTP. Projektets
FAQ ser det fra den anden side: protokollen minder om noget mellem HTTP 0.9 og HTTP 1.0, med én
slags forespørgsel, nogenlunde en `GET`.

Klienten forbinder til TCP-port 1965 – tallet henviser til den første bemandede Gemini-mission, der
fløj i marts 1965 – og gennemfører et TLS-håndtryk; begge sider skal understøtte TLS 1.2 eller
nyere. Den sender den absolutte URL efterfulgt af vognretur og linjeskift, og URL'en må højst fylde
1.024 bytes. Serveren svarer med én headerlinje: en tocifret statuskode, et mellemrum og en kort
tekst, hvis betydning afhænger af koden. Koderne falder i seks grupper: 10–19 beder om input, 20–29
betyder succes, 30–39 omdirigerer, 40–49 er midlertidige fejl, 50–59 er permanente, og 60–69 handler
om klientcertifikater. Ved succes er teksten en MIME-type, og indholdet følger som rå bytes uden
komprimering og uden opdeling i bidder. Til sidst lukker serveren forbindelsen med TLS-beskeden
close_notify, og det er sådan, klienten ved, at den har fået det hele.

Protokollen kan bære enhver slags fil, men den blev udformet sammen med sit eget dokumentformat,
gemtext, der serveres som `text/gemini`.

## Hvorfor det betyder noget

Det egentlige valg står sjældent mellem nettet og Gemini. Ifølge FAQ'en er protokollen ikke tænkt
som afløser for hverken nettet eller Gopher, og den har et navn for at udgive det samme indhold over
to eller tre af dem: bihosting og trihosting. Spørgsmålet for den, der ejer et site, er, om en
ekstra hoveddør er værd at holde åben.

Det, protokollen giver, er privatliv, der er bygget ind fra starten. FAQ'en slår fast, at Gemini
aldrig vil få noget, der svarer til headerne Cookie, Referer eller User-Agent. En forespørgsel er en
URL og intet andet, så en server har meget lidt at registrere, selv hvis operatøren ville, og der
kører intet script i læserens klient, som kan rapportere tilbage. FAQ'en regner »defensive
non-extensibility« blandt prioriteterne bag designet: formaterne for forespørgsel og svar har ikke
plads til et nyt headerfelt, så en senere version har intet sted at bringe sporing tilbage. For den,
der udgiver ren tekst, er det hele pointen.

Prisen er meget af det, nettet har fået siden HTTP 1.0. Der er ingen cookies, så en kapsel, der skal
genkende en tilbagevendende læser, beder i stedet om et klientcertifikat, som læseren selv skal
oprette og passe på. Der er som udgangspunkt ingen certifikatudsteder: specifikationen anbefaler
kraftigt Trust on First Use, eller TOFU, hvor klienten accepterer det certifikat, en server viser
første gang, og fastlåser det bagefter. Dermed bliver serverens certifikat et langvarigt løfte.
Krypteringen skjuler siden, men serverens navn rejser i TLS' Server Name Indication, og FAQ'en
indrømmer, at værtsnavnet stadig lækkes. Læserne skal bruge en særlig Gemini-klient i stedet for en
browser, så publikum er lille. Og store filer passer dårligt, fordi et svar hverken har en størrelse
eller en kontrolsum.

Et team, der har brug for interaktive formularer, konti med adgangskoder, analyse eller et rigt
layout, hører hjemme på nettet. Et team, der udgiver dokumenter og vil have en kanal, som ikke kan
spore læserne, kan tilføje Gemini for meget lidt, så længe indholdet allerede findes som filer.

## Sådan ser det ud i praksis

engineer.company er selv en kapsel på `gemini://engineer.company`. [Kolofonen](/da/credits/) nævner
Agate som det program, der besvarer Gemini-forespørgsler, ved siden af Caddy til nettet, Gophernicus
til Gopher og Tor til onion-tjenesten. Alle fire læser den samme mappe med filer, så én udrulning
opdaterer dem alle. Det er FAQ'ens bihosting strakt til fire kanaler og gjort på den billigste måde:
kapslen er blot én læser mere af en mappe, som hver udrulning alligevel fylder, frem for et ekstra
site, der skal holdes i takt.

Samme side er ærlig om den begrænsning, der er beskrevet ovenfor. Den skriver, at Gemini og Gopher
hver vil have sin egen klient i stedet for en browser, og at Gopher bærer i klartekst, hvilken side
du læste. Gemini krypterer det, men det netværk, du læser fra, ser stadig, hvilken adresse du bad
om. Det er FAQ'ens lækkede servernavn, set fra læserens stol i stedet for designerens.

Siden om [privatliv](/da/privacy/) viser den anden side af de tynde forespørgsler. Den fortæller, at
Gemini- og Gopher-kopierne af sitet slet ikke har nogen adgangslog, og at sitet siden september 2026
tæller, hvor mange forespørgsler de besvarede hver dag, og intet andet: ingen adresse, ingen side,
ingen besøgende.

## Hvor det går galt

De fleste problemer med Gemini viser sig i første linje af et svar, og den linje kan læses i hånden
med intet andet end OpenSSL:

```sh
printf 'gemini://engineer.company/\r\n' |
  openssl s_client -quiet -connect engineer.company:1965 \
    -servername engineer.company
```

Den første linje, der kommer tilbage, er headeren, for denne kapsel `20 text/gemini;lang=en`, og
siden følger efter den.

**Faste læsere bliver advaret om, at kapslen måske er under angreb.** Klienter, der følger
specifikationen, gemmer fingeraftrykket og udløbsdatoen for det første certifikat, de ser. Et andet
certifikat, før den dato er passeret, regnes som et muligt tegn på et man-in-the-middle-angreb. En
operatør, der laver et nyt certifikat ved hver udrulning eller flytter kapslen til en ny maskine
uden nøglen, udløser den advarsel hos hver eneste fast læser. Tag backup af nøgle og certifikat
sammen med resten af serveren, udsted certifikatet med lang gyldighed, og skift det først efter den
udløbsdato, klienterne allerede har registreret.

**Et søgefelt svarer med status 59.** Et svar med status 10 beder læseren om en linje input, og
klienten sender den tilbage som query-delen af den samme URL, procentkodet. URL'en må højst fylde
1.024 bytes, og en server skal afvise alt, der er længere, som en ugyldig forespørgsel. Et langt
svar fylder grænsen hurtigt, og tekst uden for ASCII fylder den hurtigere: et »ø« er to bytes i
UTF-8 og seks tegn, når det er procentkodet. Bed om korte svar, og brug status 11 til følsomt input
som en adgangsfrase, så klienterne lader være med at vise den på skærmen.

**Læsere bliver logget ud mellem siderne.** Protokollen har ingen cookies, så sessionstilstand, der
holdes på nettets måde, overlever ikke fra den ene forespørgsel til den næste. En kapsel, der skal
vide, hvem der spørger, svarer med status 60, læserens klient opretter et certifikat, og serveren
genkender det ved de følgende forespørgsler. Specifikationen begrænser certifikatet til den vært og
port, der bad om det, og til den ønskede sti og alt under den, så læg alle sider, der skal bruge
identiteten, under én sti. Skriv på siden, hvad certifikatet bruges til, for læseren skal sige ja
til det.

**En stor download bliver afbrudt, og ingen opdager det.** Et svar har hverken længde eller
kontrolsum, så en overførsel, der stopper halvvejs, kan ligne en, der blev færdig, bortset fra den
manglende close_notify. Vejledningen i god praksis foreslår, at filer over 100 MiB hellere serveres
på anden vis. Læg store filer på HTTPS, og link til dem fra kapslen; en Gemini-side må linke til en
URL med et hvilket som helst skema.

## Læs mere

- [Gemini network protocol specification](https://geminiprotocol.net/docs/protocol-specification.gmi)
  — forespørgsler, alle statuskoder, brugen af TLS og fastlåsning af certifikater i ét kort
  dokument.
- [Project Gemini FAQ](https://geminiprotocol.net/docs/faq.gmi) — projektets mål, sammenligningen
  med HTTP og Gopher og projektets eget svar på kritikken af TOFU.
- [Best practices for Gemini implementations](https://geminiprotocol.net/docs/best-practices.gmi)
  — filnavne, store filer, grænser for omdirigeringer og TLS-indstillinger.
- [History of Project Gemini](https://geminiprotocol.net/history/) — hvordan en idé fra
  Gopherspace i 2019 voksede til et netværk for sig, fortalt af projektet selv.

<https://engineer.company/da/glossary/gemini/>
