Gå til hovedindhold

Nøglefri signering af commits med gitsign

Signér Git-commits med din IdP-identitet i stedet for en langlivet SSH-nøgle. fremforges nøglefri signering af commits bruger byggestenene fra Sigstore – men alle komponenter kører på T Cloud Public eu-de, rod-CA’en ligger i et FIPS 140-2 Level 3 HSM i Tyskland, og dine signaturer er bundet til den IdP, din fremforge-organisation allerede stoler på (Microsoft Entra, Okta, Google Workspace, Authentik eller enhver anden, der taler OIDC).

Hvert signeret commit vises i Forgejo som Verified by sigstore: <your-email> via <your-IdP>. Ingen nøgleserver. Ingen overraskelser med udløb. Intet “fik jeg nu importeret den nøgle på den nye bærbare?”.

Hvorfor gøre det (frem for SSH-signering)

Signering med SSH-nøgleNøglefri (sigstore)
Binding til identitet“Matcher en SSH-nøgle, der er registreret”“Signeret af you@org.com, bekræftet af Microsoft Entra”
Nøglens levetidPermanent (rotation = manuelt)Certifikat på 10 minutter, fornyes via OIDC
Bortkommet bærbar = bortkommet nøgleDu tilføjer den nye nøgle alle steder igenDu logger ind hos din IdP – færdig
MFA ved signeringDet, du har sat op på nøglenDet, din IdP kræver (typisk MFA ved hver fornyelse)
Kan revideres i tredjeparts-CISvært (særligt kald til Forgejos API)cosign verify virker mod fremforges CA

Begge signeringsmetoder kan bruges side om side i fremforge – din organisationsadministrator vælger, hvor strengt det skal være (se Organisationspolitikker nedenfor). Nye udviklere bør som udgangspunkt bruge gitsign; eksisterende opsætninger med SSH-signering virker fortsat.

Opsætning (én gang)

1. Installér 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. Konfigurér 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

Erstat https://your-idp-issuer-url med den OIDC-udsteder-URL, din organisation har konfigureret (se feltet Tilladte OIDC-udsteder-URL’er under organisationspolitikkerne i fremforges administrationsflade, eller spørg din organisationsadministrator).

3. Signér dit første commit

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

En fane åbner sig i browseren, du logger ind hos din IdP (ét tryk, hvis du allerede er logget ind), og commitet bliver signeret. Browserens cache holder på certifikatet i cirka 10 minutter, så efterfølgende commits i samme session ikke spørger igen.

4. Kontrollér, at det virkede

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 webbrugerflade vises dit commit med mærket Verified by sigstore ved siden af commit-hashen.

Foretrækker du en GPG-nøgle?

fremforge verificerer også commits, der er signeret med din egen GPG-nøgle. Opret en, bed Git om at bruge den, og eksportér dens offentlige halvdel:

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>

Indsæt blokken, der begynder med -----BEGIN PGP PUBLIC KEY BLOCK-----, under Indstillinger → SSH / GPG nøgler → Administrer GPG-nøgler → Tilføj nøgle. Nøglens e-mailadresse skal være en bekræftet adresse på din konto; så vises dine signerede commits som Verified. Nøglefri signering ovenfor gør det samme uden en nøgle, du skal passe på, og derfor er det den anbefalede vej. Kombinér ikke de to: indstillingen gpg.format x509 fra trin 2 er kun til gitsign.

Signering i CI og uden browser

Signerer du fra CI eller fra en maskine uden browser:

# 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"

Opskrifter på at hente et token for hver IdP:

  • GitHub Actions → den indbyggede tilladelse id-token: write
  • Microsoft Entra workload identity → az account get-access-token --resource <fulcio-audience>
  • Authentik → OAuth-flow med enhedskode via gitsign’s tilstand uden browser
  • Alle andre → ethvert OIDC-kompatibelt token virker, så længe udstederen står på din organisations tilladelsesliste

Organisationspolitikker

To indstillinger på /<your-org>/_admin/auth-policy styrer, hvordan nøglefri signering opfører sig:

  • Tilladte OIDC-udsteder-URL’er – skal indeholde din IdP’s udsteder-URL. Pre-receive-hooket læser certifikatets udvidelse OIDCIssuer og afviser ethvert commit, hvis udsteder ikke står på listen. Tom liste = sigstore-signering er slået fra for denne organisation.
  • Streng tilstand – når den er slået til, accepteres kun sigstore-signerede commits på branches, hvor Require signed commits er slået til. SSH-signerede commits afvises. Slå den ikke til, før alle dine udviklere er gået over.

Fejlfinding

gitsign: oidc issuer not allowed by Fulcio: Din IdP’s udsteder-URL er korrekt, men platformens Fulcio stoler endnu ikke på den. Organisationsadministrator: åbn /<slug>/_admin/auth-policy, og tilføj udsteder-URL’en under Tilladte OIDC-udsteder-URL’er. fremforge anvender ændringen automatisk (cirka 30 s); der skal ikke oprettes en sag hos driften.

gitsign: cert expired before push completed: Du har kørt et langvarigt script mellem udstedelsen af certifikatet og dit push. Certifikatet gælder i 10 minutter. Kør git commit --amend --no-edit -S for at signere igen med et nyt certifikat, før du pusher.

Mærket Verified mangler på et signeret commit: Tjek /<your-org>/<repo>/commit/<sha>/status – statussen fremforge-sigstore-verified vises som et tjek ved siden af de andre CI-tjek. Står den til “failure”, så klik for at se årsagen. Mangler den helt, kørte pre-receive-hooket ikke – enten er commitet for gammelt (pushet, før politikken blev slået til), eller også gik dit push en uventet vej. Kontakt support med commit-SHA’en.

Forgejos mærke “Verified” siger “unsigned”, men git verify-commit virker: Forgejos indbyggede verifikation forstår endnu ikke sigstore-signaturer – derfor bruger vi i stedet mærket fra commit-statussen. Statussen fremforge-sigstore-verified er den autoritative kilde. (Vi følger gitea#34361 for understøttelse i upstream.)

Sådan virker det bag kulisserne

  1. gitsign åbner din IdP’s OIDC-loginflow.
  2. Din IdP udsteder et kortlivet ID-token, der bekræfter din identitet.
  3. gitsign sender tokenet til fremforges Fulcio-CA (sign.frem.sh).
  4. Fulcio validerer tokenet og udsteder et X.509-certifikat på 10 minutter med din e-mailadresse i SAN og IdP’ens udsteder-URL i udvidelsen OIDCIssuer. Signeringsnøglen ligger i et T Cloud Public DEW HSM (FIPS 140-2 Level 3, tysk jurisdiktion).
  5. gitsign signerer commitets indhold med certifikatets private nøgle (som kun ligger i din lokale browsers hukommelse i certifikatets levetid).
  6. fremforges TSA (tsa.frem.sh) signerer et betroet tidsstempel efter RFC 3161, der fastslår, at “certifikatet var gyldigt i netop dette sekund” – det er det, der får verifikationen til at virke, også efter certifikatet er udløbet.
  7. Signaturen, certifikatet og tidsstemplet indlejres i commitets gpgsig-header (CMS/PKCS7-format).
  8. Du pusher. fremforges pre-receive-hook verificerer certifikatkæden → vores Fulcio-rod, tidsstemplet → vores TSA-rod, og OIDC-udstederen mod din organisations liste over tilladte udstedere.
  9. Forgejos API til commit-status registrerer resultatet.

Verifikation kræver kun Fulcio-rodcertifikatet + TSA-roden – ingen netværkskald under verifikationen. Nedetid på CA’en påvirker ikke commits, der allerede er signeret, kun nye forsøg på at signere.

Uafhængig verifikation uden for fremforge

Vil du lade en tredjeparts-CI (eller bare din bærbare) verificere commits signeret via fremforge uden at 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 enhver anden signatur i Sigstore-økosystemet – virker med cosign verify-blob og resten af OpenSSF’s værktøjer til signering af commits og blobs. (Bemærk: slsa-verifier verificerer build-provenance for artefakter, ikke signaturer på git-commits, så det er ikke relevant her. fremforges build-provenance er en separat vej signeret med Ed25519 – se SLSA provenance.)