Gå til hovedinnhold

Nøkkelfri commit-signering med gitsign

Signer Git-commits med IdP-identiteten din, ikke med en langlivet SSH-nøkkel. fremforges nøkkelfrie commit-signering bruker byggeklosser fra Sigstore, men alle komponentene kjører på T Cloud Public eu-de, rotsertifikatet (CA) ligger i en FIPS 140-2 Level 3 HSM i Tyskland, og signaturene dine knyttes til den IdP-en fremforge-organisasjonen din allerede stoler på (Microsoft Entra, Okta, Google Workspace, Authentik, alt som snakker OIDC).

Alle signerte commits vises i Forgejo som Verified by sigstore: <your-email> via <your-IdP>. Ingen nøkkelserver. Ingen overraskelser med utløpsdatoer. Ingen «importerte jeg den nøkkelen på den nye PC-en?».

Hvorfor bry seg (sammenlignet med SSH-signering)

Signering med SSH-nøkkelNøkkelfri (sigstore)
Knytning til identitet«Samsvarer med en registrert SSH-nøkkel»«Signert av you@org.com, bekreftet av Microsoft Entra»
Nøkkelens levetidPermanent (rotasjon = manuelt)Sertifikat på 10 minutter, fornyes via OIDC
Mistet bærbar PC = mistet nøkkelDu legger den nye nøkkelen til overalt på nyttDu logger inn hos IdP-en din, ferdig
MFA ved signeringDet du har satt på nøkkelenDet IdP-en din krever (vanligvis MFA ved hver fornyelse)
Kan revideres i tredjeparts-CIVanskelig (eget kall mot Forgejo-API-et)cosign verify fungerer mot fremforges CA

Begge signeringsmetodene kan brukes side om side i fremforge; administratoren i organisasjonen bestemmer hvor strengt det skal være (se Organisasjonspolicyer nedenfor). Nye utviklere bør bruke gitsign som standard; eksisterende oppsett med SSH-signering fortsetter å fungere.

Oppsett (én gang)

1. Installer gitsign

# macOS (Homebrew)
brew install sigstore/tap/gitsign

# Linux (binary)
curl -sLO https://github.com/sigstore/gitsign/releases/latest/download/gitsign-linux-amd64
chmod +x gitsign-linux-amd64 && sudo mv gitsign-linux-amd64 /usr/local/bin/gitsign

# Verify
gitsign --version

2. Konfigurer git

git config --global gpg.x509.program gitsign
git config --global gpg.format x509
git config --global commit.gpgsign true

# Point gitsign at fremforge's private Fulcio + TSA (not the public Sigstore).
git config --global gitsign.fulcio https://sign.frem.sh
git config --global gitsign.timestamp-server-url https://tsa.frem.sh
git config --global gitsign.rekor ""   # explicitly empty — fremforge uses TSA-only, no transparency log
git config --global gitsign.connectorID https://your-idp-issuer-url

Bytt ut https://your-idp-issuer-url med URL-en til OIDC-utstederen organisasjonen din har konfigurert (se delen Org policies → Allowed OIDC issuers i administrasjonsfanen i fremforge, eller spør administratoren i organisasjonen).

3. Signer din første commit

cd your-repo
git commit -S -m "First signed commit"

En fane åpnes i nettleseren, du autentiserer deg hos IdP-en din (ett trykk hvis du allerede er innlogget), og commiten signeres. Nettleseren holder sertifikatet i hurtigbufferen i omtrent 10 minutter, så du blir ikke spurt igjen ved senere commits i samme økt.

4. Kontroller at det fungerte

git verify-commit HEAD
# tlog index: <n>
# Good signature from [you@yourorg.com](you@yourorg.com)
# Validated Git signature: true
# Validated Rekor entry: true (or "skipped" — fremforge doesn't run Rekor)

I fremforges nettgrensesnitt vises merket Verified by sigstore ved siden av commit-hashen.

Foretrekker du en GPG-nøkkel?

fremforge bekrefter også commits som er signert med din egen GPG-nøkkel. Lag en nøkkel, be Git bruke den, og eksporter den offentlige delen:

gpg --full-generate-key
gpg --list-secret-keys --keyid-format=long     # the key ID follows "sec   ed25519/"
git config --global user.signingkey <key-id>
git config --global commit.gpgsign true
gpg --armor --export <key-id>

Lim inn blokken som begynner med -----BEGIN PGP PUBLIC KEY BLOCK-----, under Innstillinger → SSH- / GPG-nøkler → Administrer GPG-nøkler → Legg til nøkkel. E-postadressen i nøkkelen må være en bekreftet adresse på kontoen din; da vises de signerte commitene dine som Bekreftet. Den nøkkelfrie signeringen ovenfor gjør det samme uten en nøkkel du må passe på, og derfor er den anbefalt. Ikke kombiner de to: innstillingen gpg.format x509 fra trinn 2 er bare for gitsign.

Signering i CI / uten skjerm

Hvis du signerer fra CI eller en maskin uten nettleser:

# Get an OIDC token from your IdP (different per IdP — see below)
export SIGSTORE_ID_TOKEN="<bearer-token-from-your-idp>"

# Then sign as usual
git commit -S -m "Signed from CI"

Oppskrifter for å hente token per IdP:

  • GitHub Actions → den innebygde tillatelsen id-token: write
  • Microsoft Entra workload identity → az account get-access-token --resource <fulcio-audience>
  • Authentik → OAuth-flyt med enhetskode via gitsign i modus uten skjerm
  • Alt annet → et hvilket som helst OIDC-kompatibelt token fungerer, så lenge utstederen står på tillatelseslisten til organisasjonen din

Organisasjonspolicyer

To innstillinger under /<your-org>/_admin/auth-policy styrer hvordan nøkkelfri signering oppfører seg:

  • Allowed OIDC issuer URLs: må inneholde utsteder-URL-en til IdP-en din. Pre-receive-hooken leser sertifikatets OIDCIssuer-utvidelse og avviser alle commits der utstederen ikke står på denne listen. Tom liste = sigstore-signering er slått av for denne organisasjonen.
  • Strict mode: når denne er på, godtas bare sigstore-signerte commits på brancher der Krev signerte commits er slått på. SSH-signerte commits blir avvist. Ikke slå den på før alle utviklerne dine har gått over.

Feilsøking

gitsign: oidc issuer not allowed by Fulcio: utsteder-URL-en til IdP-en din er riktig, men plattformens Fulcio stoler ikke på den ennå. Administratoren i organisasjonen åpner /<slug>/_admin/auth-policy og legger utsteder-URL-en til i Allowed OIDC issuer URLs. fremforge tar i bruk endringen automatisk (omtrent 30 sekunder); det trengs ingen henvendelse til operatøren.

gitsign: cert expired before push completed: du kjørte et langvarig skript mellom utstedelsen av sertifikatet og push. Sertifikatet gjelder i 10 minutter. Kjør git commit --amend --no-edit -S for å signere på nytt med et ferskt sertifikat før du pusher.

Verified-merket mangler på en signert commit: sjekk /<your-org>/<repo>/commit/<sha>/status. Statusen fremforge-sigstore-verified vises som en sjekk ved siden av de andre CI-sjekkene. Står den som «failure», klikker du for å se årsaken. Mangler den helt, ble pre-receive-hooken ikke kjørt: enten er commiten for gammel (pushet før policyen ble slått på), eller så gikk pushen din en uventet vei. Kontakt kundestøtte med commitens SHA.

Forgejos «Verified»-merke sier «unsigned», men git verify-commit fungerer: Forgejos innebygde kontroll forstår ennå ikke sigstore-signaturer, og det er derfor vi bruker merket fra commit-statusen i stedet. Statusen fremforge-sigstore-verified er den autoritative kilden. (Vi følger gitea#34361 for støtte i upstream.)

Slik fungerer det under panseret

  1. gitsign åpner OIDC-innloggingsflyten hos IdP-en din.
  2. IdP-en din utsteder et kortlivet ID-token som bekrefter identiteten din.
  3. gitsign sender tokenet til fremforges Fulcio-CA (sign.frem.sh).
  4. Fulcio kontrollerer tokenet og utsteder et X.509-sertifikat på 10 minutter med e-postadressen din i SAN og IdP-ens utsteder-URL i OIDCIssuer-utvidelsen. Signeringsnøkkelen ligger i en T Cloud Public DEW HSM (FIPS 140-2 Level 3, tysk jurisdiksjon).
  5. gitsign signerer innholdet i commiten med sertifikatets private nøkkel (som bare holdes i nettleserens minne lokalt så lenge sertifikatet lever).
  6. fremforges TSA (tsa.frem.sh) signerer et pålitelig tidsstempel etter RFC 3161 som slår fast at «sertifikatet var gyldig nøyaktig dette sekundet». Det er dette som gjør at kontrollen fungerer også etter at sertifikatet har utløpt.
  7. Signaturen, sertifikatet og tidsstempelet bygges inn i commitens gpgsig-header (CMS/PKCS7-format).
  8. Du pusher. fremforges pre-receive-hook kontrollerer sertifikatkjeden → vår Fulcio-rot, tidsstempelet → vår TSA-rot, og OIDC-utstederen mot organisasjonens tillatelsesliste.
  9. Forgejos API for commit-status registrerer resultatet.

Kontrollen trenger bare Fulcio-rotsertifikatet + TSA-roten, og ingen nettverkskall under kontrollen. Nedetid i CA-en påvirker ikke commits som allerede er signert, bare nye signeringsforsøk.

Uavhengig kontroll utenfor fremforge

Hvis du vil at en tredjeparts-CI (eller bare den bærbare PC-en din) skal kontrollere commits signert i fremforge uten å stole på fremforge:

# Fetch fremforge's CA root + TSA root (publicly served, integrity via TLS)
curl -sf https://docs.frem.sh/_pki/fulcio-root.pem > /tmp/fremforge-fulcio.pem
curl -sf https://docs.frem.sh/_pki/tsa-root.pem    > /tmp/fremforge-tsa.pem

# Use cosign to verify a specific commit
cosign verify-blob \
  --certificate-chain /tmp/fremforge-fulcio.pem \
  --timestamp-certificate-chain /tmp/fremforge-tsa.pem \
  --certificate-identity "you@yourorg.com" \
  --certificate-oidc-issuer "https://your-idp-issuer" \
  <commit-bytes>

Samme signaturformat som alle andre signaturer i Sigstore-økosystemet: det fungerer med cosign verify-blob og resten av OpenSSF-verktøyene for signering av commits og blobber. (Merk: slsa-verifier kontrollerer byggeproveniens for artefakter, ikke signaturer på git-commits, så det er ikke relevant her. fremforges byggeproveniens går en egen vei, signert med Ed25519; se SLSA-proveniens.)