You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
|`AICR_TLOG_UPLOAD`|`true`|`parseSigningConfig` (Mode A only) |
185
185
|`AICR_BINARY_ATTESTATION_FILE`| unset → `<executable>-attestation.sigstore.json` next to the binary |`resolveBinaryAttestationPath` (override for ko `KO_DATA_PATH` layouts) |
186
-
|`AICR_BINARY_ATTESTATION_IDENTITY_REGEXP`| unset → `verifier.TrustedRepositoryPattern` (release `on-tag.yaml`) |`resolveBinaryAttestationIdentityPattern` (must contain `NVIDIA/aicr`, validated by `verifier.ValidateIdentityPattern`; retargets the attesting NVIDIA workflow, e.g. an e2e build) |
186
+
|`AICR_BINARY_ATTESTATION_IDENTITY_REGEXP`| unset → `verifier.TrustedRepositoryPattern` (release `on-tag.yaml`) |`resolveBinaryAttestationIdentityPattern` (must be confined to `NVIDIA/aicr` — begins with the repository prefix, no top-level alternation, and no match against foreign-identity canaries — validated by `verifier.ValidateIdentityPattern`; retargets the attesting NVIDIA workflow, e.g. an e2e build) |
187
187
188
188
See [Server-Side Bundle Signing](#server-side-bundle-signing) for the identity
189
189
model and validation rules behind these variables.
@@ -262,9 +262,12 @@ the running `os.Executable()` binary's digest.
262
262
pattern the attestation is verified against: `verifier.TrustedRepositoryPattern`
263
263
(the release `on-tag.yaml` workflow) by default, or the
264
264
`AICR_BINARY_ATTESTATION_IDENTITY_REGEXP` override when set. The override is
265
-
validated by `verifier.ValidateIdentityPattern`, which requires it to contain
266
-
`NVIDIA/aicr`, so it can only retarget which NVIDIA workflow attested the binary
267
-
(e.g. the server-kms e2e build), never widen the org. A bad override fails
265
+
validated by `verifier.ValidateIdentityPattern`, which requires it to *begin
266
+
with*`https://github.com/NVIDIA/aicr/` (a leading `^` is allowed) and to avoid
267
+
top-level alternation, so it can only retarget which NVIDIA workflow attested
268
+
the binary (e.g. the server-kms e2e build), never widen the org. Merely
269
+
containing `NVIDIA/aicr` is not enough: a pattern that reaches the repository
270
+
down one branch and something else down another is rejected. A bad override fails
268
271
startup fast. This mirrors the CLI's `--certificate-identity-regexp`, and a
269
272
custom pattern is logged because bundles the server then signs will not pass a
Splitting emit from publish lets the cluster-bound step run where the
631
+
cluster is reachable and the Sigstore-bound step run where Fulcio and
632
+
Rekor are. The result is content-identical to the one-shot path.
633
+
634
+
`SignCatalog` is the counterpart to `VerifyCatalog`, signing this
635
+
Client's catalog and returning the serialized Sigstore bundle.
636
+
637
+
**`SignCatalog` rejects the signing modes it can tell `VerifyCatalog`
638
+
will not verify** — with one documented exception, below. Verification
639
+
checks against the public-good Sigstore root, requires a
640
+
transparency-log entry, and accepts keyless GitHub OIDC certificates
641
+
only, so these four `OIDCResolve` settings are rejected with
642
+
`ErrCodeInvalidRequest` before any signing work runs:
643
+
644
+
| Setting | Why it is rejected |
645
+
|---|---|
646
+
|`SigningKey`| A key-signed catalog has no verification path at all. |
647
+
|`FulcioURL`| A private CA's certificate does not chain to the public-good root. |
648
+
|`RekorURL`| A private log's entries do not verify against the public-good root either. A public-good v1 URL would verify, but the two are indistinguishable from the URL alone, so this fails closed. |
649
+
|`DisableTLogUpload`| Verification requires a transparency-log entry. |
650
+
651
+
The point of the guard is that you should not be able to sign a catalog
652
+
successfully and then discover the documented counterpart refuses it;
653
+
if private catalog signing is ever needed, both halves move together.
654
+
655
+
**The exception: `SigningConfigPath` is not validated.** It passes
656
+
through because the release path requires it, and a Sigstore signing
657
+
config can itself name a private Fulcio or Rekor — so a signing config
658
+
*can* still produce a catalog `VerifyCatalog` rejects. Treat the guard
659
+
as covering the four settings above, not as a guarantee about every
660
+
input. Each rejected setting exists *only* to depart from the
661
+
public-good defaults, which is what makes rejecting it unambiguous; a
662
+
signing config does not, and rejecting it would break the release.
663
+
Validating the loaded config against the public-good endpoints is the
664
+
principled fix if this exception ever bites.
665
+
666
+
Neither signing method imposes a facade timeout, unlike their
667
+
verification counterparts: keyless OIDC can block on a human completing
668
+
a browser or device-code flow. Pass a context with a deadline for
669
+
unattended use. Neither prompts — interactive signing disclosure is a UI
670
+
concern the caller owns, so both can run unattended from a server.
671
+
446
672
## Errors
447
673
448
674
All errors returned by the facade are `*pkg/errors.StructuredError`
Copy file name to clipboardExpand all lines: docs/user/api-reference.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -805,7 +805,7 @@ certificate from Fulcio using its own OIDC identity. Operator setup for Mode B:
805
805
| `AICR_SIGNING_CONFIG_PATH` | A, B | Sigstore SigningConfig JSON for Rekor v2 targeting. |
806
806
| `AICR_TLOG_UPLOAD` | A | Set `false` to skip the Rekor upload for air-gapped KMS signing. KMS-only; keyless always uploads. |
807
807
| `AICR_BINARY_ATTESTATION_FILE` | A, B | Absolute path to the aicrd binary attestation. Unset defaults to the conventional `<executable>-attestation.sigstore.json` next to the running binary. Set it when the attestation ships elsewhere in the image, e.g. a ko build stages assets under `KO_DATA_PATH` (`/var/run/ko/aicrd-attestation.sigstore.json`) rather than next to the binary. |
808
-
| `AICR_BINARY_ATTESTATION_IDENTITY_REGEXP` | A, B | Certificate-identity pattern the server pins its own binary attestation to. Unset uses the release-workflow default (`on-tag.yaml`). A custom value MUST still contain `NVIDIA/aicr` so it stays pinned to the NVIDIA org; it retargets which NVIDIA workflow attested the binary (e.g. an e2e workflow), not the org, and a value that is not so pinned fails startup. Mirrors the CLI's `--certificate-identity-regexp`. |
808
+
| `AICR_BINARY_ATTESTATION_IDENTITY_REGEXP` | A, B | Certificate-identity pattern the server pins its own binary attestation to. Unset uses the release-workflow default (`on-tag.yaml`). A custom value MUST begin with `https://github.com/NVIDIA/aicr/` (leading `^` allowed) and must not use top-level alternation, so it stays confined to the NVIDIA repository; it retargets which NVIDIA workflow attested the binary (e.g. an e2e workflow), not the org, and a value that is not so pinned fails startup. Mirrors the CLI's `--certificate-identity-regexp`. |
809
809
810
810
Setting both `AICR_SIGNING_KEY` and the keyless variables is ambiguous and the
Copy file name to clipboardExpand all lines: docs/user/cli-config.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -201,7 +201,7 @@ spec:
201
201
requireCreator: ci@myorg.example.com
202
202
cliVersionConstraint: ">= 0.16.0"
203
203
trust: # material verification runs against
204
-
certificateIdentityRegexp: ""# must contain NVIDIA/aicr when set
204
+
certificateIdentityRegexp: ""#when set, must BEGIN with https://github.com/NVIDIA/aicr/
205
205
key: ""# KMS URI or local PEM public-key path
206
206
trustRoot: ""# private Sigstore trusted_root.json
207
207
```
@@ -303,7 +303,7 @@ checked after verification runs, `trust` holds the material it verifies against.
303
303
| `policy.minTrustLevel` | string | `unknown` \| `unverified` \| `attested` \| `verified`, or `max` (the CLI default) to auto-detect the highest level the bundle can reach |
304
304
| `policy.requireCreator` | string | Pins the OIDC identity in the bundle attestation's signing certificate |
305
305
| `policy.cliVersionConstraint` | string | Constrains the `aicr` version in the attestation predicate; supports `>=`, `>`, `<=`, `<`, `==`, `!=`, and a bare version means `>=` |
306
-
| `trust.certificateIdentityRegexp` | string | Certificate identity pattern for binary attestation verification; must contain `NVIDIA/aicr` |
306
+
| `trust.certificateIdentityRegexp` | string | Certificate identity pattern for binary attestation verification; must *begin with* `https://github.com/NVIDIA/aicr/` (leading `^` allowed) and must not use top-level alternation, so it stays confined to the repository |
307
307
| `trust.key` | string | KMS key URI (`awskms://` \| `gcpkms://` \| `azurekms://` \| `hashivault://`) or local PEM public-key path; the verify counterpart to `spec.bundle.attestation.signingKey` |
308
308
| `trust.trustRoot` | string | Path to a private Sigstore `trusted_root.json`, additive to the built-in public-good root |
| `--identity-pattern` | string | | Override the NVIDIA CI certificate identity regexp. Must contain `NVIDIA/aicr` — overrides that drop the repo prefix are rejected. Also reads `AICR_CATALOG_IDENTITY_PATTERN`. |
785
+
| `--identity-pattern` | string | | Override the NVIDIA CI certificate identity regexp. Must *begin with* `https://github.com/NVIDIA/aicr/` (a leading `^` is allowed; `github\.com` also accepted) and must not use top-level alternation, so the pattern stays confined to the repository. Put any alternatives after the prefix, e.g. `.../aicr/\.github/workflows/(on-tag\|release)\.yaml@.*`. Also reads `AICR_CATALOG_IDENTITY_PATTERN`. |
0 commit comments