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øgle | Nø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 levetid | Permanent (rotation = manuelt) | Certifikat på 10 minutter, fornyes via OIDC |
| Bortkommet bærbar = bortkommet nøgle | Du tilføjer den nye nøgle alle steder igen | Du logger ind hos din IdP – færdig |
| MFA ved signering | Det, du har sat op på nøglen | Det, din IdP kræver (typisk MFA ved hver fornyelse) |
| Kan revideres i tredjeparts-CI | Svæ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 --version2. 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-urlErstat 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
OIDCIssuerog 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
gitsignåbner din IdP’s OIDC-loginflow.- Din IdP udsteder et kortlivet ID-token, der bekræfter din identitet.
gitsignsender tokenet til fremforges Fulcio-CA (sign.frem.sh).- 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). gitsignsignerer commitets indhold med certifikatets private nøgle (som kun ligger i din lokale browsers hukommelse i certifikatets levetid).- 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. - Signaturen, certifikatet og tidsstemplet indlejres i commitets
gpgsig-header (CMS/PKCS7-format). - 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.
- 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.)