CONTAINERS-SI...NG-PARAMS.YAML(5)

πŸ“¦
version 5.39.2 Β· 4 versions
, in alpine 3.24, fedora 43, fedora 44, ubuntu resolute, ubuntu stonking

πŸ’– containers-sigstore-signing-params.yaml β€” the sigstore signing parameter file, explained πŸ’–

okay bestie, sit down, grab a boba, because this one is literally the cheat sheet for the syntax of the sigstore signing parameter file πŸŽ€ and it's lowkey important so we're doing it properly.


✨ NAME ✨

containers-sigstore-signing-params.yaml β€” it's the syntax spec for the sigstore signing parameter file. that's the whole vibe. πŸ’…


🌸 DESCRIPTION 🌸

So. Sigstore signing parameter files exist to store options that may be required to create sigstore signatures. That's it, that's the job.

Big thing you need to know: there is no default location for these files. None. Not a single one. πŸ™ˆ They are user-managed, and they get used as inputs to a container image signing operation. Like, for example:

skopeo copy --sign-by-sigstore=param-file.yaml
podman push --sign-by-sigstore=param-file.yaml

see how it's just a plain input file? yeah. you bring the file, they do the signing. 🫢


πŸ¦‹ FORMAT πŸ¦‹

Sigstore signing parameter files use YAML. Periodt.

Many parameters are optional, but β€” and this is the important part β€” the file must specify enough to create a signature; in particular, either a private key, or Fulcio. one of the two, bestie. you can't just show up empty-handed. πŸ’€


πŸ”‘ Signing with Private Keys πŸ”‘

  • privateKeyFile: path β€” creates a signature using a private key at path. And listen: the mere existence of this field triggers the use of a private key. it doesn't ask twice, it doesn't wait, it's main character energy. ✨
  • privateKeyPassphraseFile: passphrasePath β€” reads the passphrase required to use privateKeyFile from passphrasePath.
    • Optional: if this is not set, the user must provide the passphrase interactively. so like, you'll be typing it in yourself, live, no cap. ⌨️

🧚 Signing with Fulcio-generated Certificates 🧚

Okay this one's the glow-up. Instead of a static private key, the signing process generates a short-lived key pair and asks a Fulcio server to issue a certificate for that key pair, based on the user authenticating to an OpenID Connect provider. iconic behaviour honestly.

To specify Fulcio, include a fulcio sub-object with one or more of the following keys. And heads up: a Rekor server must be specified as well. don't forget the Rekor part, bestie, it's not optional vibes. πŸŽ€

  • fulcioURL: URL β€” Required. the URL of the Fulcio server to use. πŸ’–
  • oidcMode: interactive | deviceGrant | staticToken β€” Required. this specifies how to obtain the necessary OpenID Connect credential. and here's the tea on each one:
    • interactive β€” opens a web browser on the same machine, or if that is not possible, asks the user to open a browser manually and to type in the provided code. It requires the user to be able to directly interact with the signing process. so like, you gotta be there. present. in the room. 🫢
    • deviceGrant β€” uses a device authorization grant flow (RFC 8628). It requires the user to be able to read text printed by the signing process, and to act on it reasonably promptly. so read fast and click faster, okay? ⏰
    • staticToken β€” provides a pre-existing OpenID Connect β€œID token”, which must have been obtained separately. you bring the token, it does the rest. πŸ”₯
  • oidcIssuerURL: URL β€” Required for oidcMode: interactive or deviceGrant. the URL of an OpenID Connect issuer server to authenticate with. πŸ‘‘
  • oidcClientID: client ID β€” used for oidcMode: interactive or deviceGrant to identify the client when contacting the issuer. Optional but likely to be necessary in those cases. so like, "optional" but also... bring it. πŸ™ˆ
  • oidcClientSecret: client secret β€” used for oidcMode: interactive or deviceGrant to authenticate the client when contacting the issuer. Optional. that's it, that's the whole sentence. ✨
  • oidcIDToken: token β€” Required for oidcMode: staticToken. An OpenID Connect ID token that identifies the user (and authorizes certificate issuance). it's giving "your whole identity in one string". πŸ’…

🌈 Recording the Signature to a Rekor Transparency Server 🌈

This can be combined with either a private key or Fulcio. and here's the nuance: it is, practically speaking, required for Fulcio. It is optional when a static private key is used, but necessary for interoperability with the default configuration of cosign. so like... you can skip it with a static key, but cosign will be like "girl what". 😭

  • rekorURL: URL β€” the URL of the Rekor server to use. that's the one. ⭐

πŸŽ€ EXAMPLES πŸŽ€

πŸ“ Sign Using a Pre-existing Private Key πŸ“

Uses the ”community infrastructure” Rekor server.

privateKeyFile: "/home/user/sigstore/private-key.key"
privateKeyPassphraseFile: "/mnt/user/sigstore-private-key"
rekorURL: "https://rekor.sigstore.dev"

look at that. clean. three lines. slay. πŸ’…


πŸ¦‹ Sign Using a Fulcio-Issued Certificate πŸ¦‹

Uses the ”community infrastructure” Fulcio and Rekor server, and the Dex OIDC issuer which delegates to other major issuers like Google and GitHub.

⚠️ Other configurations will very likely need to also provide an OIDC client secret. so if you're not doing the community infra thing, bestie, go add that secret. πŸ™ˆ
fulcio:
  fulcioURL: "https://fulcio.sigstore.dev"
  oidcMode: "interactive"
  oidcIssuerURL: "https://oauth2.sigstore.dev/auth"
  oidcClientID: "sigstore"
rekorURL: "https://rekor.sigstore.dev"

nested yaml, community infra, browser pops open, you sign in β€” it's giving whole experience. πŸ”₯


πŸ‘‘ SEE ALSO πŸ‘‘

go read those too, iykyk. 🫢


and that's the page, bestie!! written by Miloslav Trmač back in January 2023, living in the signing corner of the sigstore manual β€” mwah, obsessed, no notes. πŸ’–βœ¨πŸŽ€πŸ¦‹πŸŒΈπŸ’