-
Notifications
You must be signed in to change notification settings - Fork 129
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Examples on using generic provenance for containers #332
Comments
If you can provide some suggestions on what such policies should check for, I can create and contribute them from Kyverno's side. |
@chipzoller I think that, for starters, we need an example policy that verifies the Some other nice to haves would be:
|
I'm working on figuring out how verification will work when using the generic workflow w/ containers. Based on the Kyverno docs it seems like Kyverno supports a I'm guessing that a user's GH Actions workflow would look something like the following:
...but I need to check what the |
Take a look at the work I've already done here. The first of three attestations happens here. When using "subject": [
{
"name": "ghcr.io/chipzoller/zulu",
"digest": {
"sha256": "5365f368065f3e93629b71b404d75c03154be84ed9853a2ea6739d6994a1993e"
}
}
], You therefore want all attestations to have the same subject, and that's why I'm stripping just the raw predicate out of the in-toto attested form here. If that isn't done, the subjects will be different on account of the generic provenance generator producing a different subject. You can see here where I even customize the input name (for experimentation) knowing that it'll get stripped and replaced in the later step. So, ideally, whenever the provenance generator for container images is made available, it should produce either the raw predicate (unattested form) allowing to be used as an input to |
Sample Kyverno Policies with Keyless VerificationAll the below Kyverno policies are set to
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: check-slsa-attestations
spec:
validationFailureAction: enforce
webhookTimeoutSeconds: 30
rules:
- name: check-uri-keyless
match:
any:
- resources:
kinds:
- Pod
verifyImages:
- imageReferences:
# Replace with your image. Wildcard values are supported.
- "myreg.org/path/repo:*"
attestors:
- entries:
- keyless:
# In the case of GitHub Actions, the subject will be set to your Actions workflow responsible
# for kicking off the process. Note that this will not be set to the external action
# responsible for the provenance generation.
subject: "https://github.com/myname/myrepo/.github/workflows/my-workflow.yaml@refs/heads/mybranch"
issuer: "https://token.actions.githubusercontent.com"
attestations:
- predicateType: https://slsa.dev/provenance/v0.2
conditions:
- all:
# The invocation.configSource.uri in the attestation will be set to the repository
# and branch where your workflow, in the case of GitHub Actions, is located.
# Replace with your values.
- key: "{{ invocation.configSource.uri }}"
operator: Equals
value: "git+https://github.com/myname/myrepo@refs/heads/mybranch"
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: check-slsa-attestations
spec:
validationFailureAction: enforce
webhookTimeoutSeconds: 30
rules:
- name: check-entrypoint-keyless
match:
any:
- resources:
kinds:
- Pod
verifyImages:
- imageReferences:
# Replace with your image. Wildcard values are supported.
- "myreg.org/path/repo:*"
attestors:
- entries:
- keyless:
# In the case of GitHub Actions, the subject will be set to your Actions workflow responsible
# for kicking off the process. Note that this will not be set to the external action
# responsible for the provenance generation.
subject: "https://github.com/myname/myrepo/.github/workflows/my-workflow.yaml@refs/heads/mybranch"
issuer: "https://token.actions.githubusercontent.com"
attestations:
- predicateType: https://slsa.dev/provenance/v0.2
conditions:
- all:
# The invocation.configSource.entryPoint in the attestation will be set to the full
# path to your workflow. With GitHub Actions, this will begin with .github/
# Replace with your values.
- key: "{{ invocation.configSource.entryPoint }}"
operator: Equals
value: ".github/workflows/my-workflow.yaml"
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: check-slsa-attestations
spec:
validationFailureAction: enforce
webhookTimeoutSeconds: 30
rules:
- name: check-builder-id-keyless
match:
any:
- resources:
kinds:
- Pod
verifyImages:
- imageReferences:
# Replace with your image. Wildcard values are supported.
- "myreg.org/path/repo:*"
attestors:
- entries:
- keyless:
# In the case of GitHub Actions, the subject will be set to your Actions workflow responsible
# for kicking off the process. Note that this will not be set to the external action
# responsible for the provenance generation.
subject: "https://github.com/myname/myrepo/.github/workflows/my-workflow.yaml@refs/heads/mybranch"
issuer: "https://token.actions.githubusercontent.com"
attestations:
- predicateType: https://slsa.dev/provenance/v0.2
conditions:
- all:
# This expression uses a regex pattern to ensure the builder.id in the attestation is equal to the official
# SLSA provenance generator workflow and uses a tagged release in semver format. If using a specific SLSA
# provenance generation workflow, you may need to adjust the first input as necessary.
- key: "{{ regex_match('^https://github.com/slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@refs/tags/v[0-9].[0-9].[0-9]$','{{ builder.id}}') }}"
operator: Equals
value: true
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: check-slsa-attestations
spec:
validationFailureAction: enforce
webhookTimeoutSeconds: 30
rules:
- name: check-all-keyless
match:
any:
- resources:
kinds:
- Pod
verifyImages:
- imageReferences:
# Replace with your image. Wildcard values are supported.
- "myreg.org/path/repo:*"
attestors:
- entries:
- keyless:
# In the case of GitHub Actions, the subject will be set to your Actions workflow responsible
# for kicking off the process. Note that this will not be set to the external action
# responsible for the provenance generation.
subject: "https://github.com/myname/myrepo/.github/workflows/my-workflow.yaml@refs/heads/mybranch"
issuer: "https://token.actions.githubusercontent.com"
attestations:
- predicateType: https://slsa.dev/provenance/v0.2
conditions:
- all:
- key: "{{ invocation.configSource.uri }}"
operator: Equals
value: "git+https://github.com/myname/myrepo@refs/heads/mybranch"
- key: "{{ invocation.configSource.entryPoint }}"
operator: Equals
value: ".github/workflows/my-workflow.yaml"
- key: "{{ regex_match('^https://github.com/slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@refs/tags/v[0-9].[0-9].[0-9]$','{{ builder.id}}') }}"
operator: Equals
value: true Keyed VerificationFor any of the above policies, if a user wishes to verify them with key-based signing as opposed to keyless, they can simply substitute the - keys:
publicKeys: |
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2kCXNpRME7TtCbzLNyRhdZY5JvmC
sAeNYYYg5LYpLdYjqtdfly54yEevhBGQUy0vn/tbSOptTnUNcNgnNaBlPg==
-----END PUBLIC KEY----- |
@chipzoller Thanks! Those policies look good! I totally forgot about checking the subject from the cert. It's good you added that. Could you create these as all just one As for the subjects, since they are an input into the generic workflow we should be able to set that to the correct value I would think. Does the # gcr.io/my-project/app@sha256:6e398316742b7aa4a93161dce4a23bc5c545700b862b43347b941000b112ec3e
# becomes
# 6e398316742b7aa4a93161dce4a23bc5c545700b862b43347b941000b112ec3e gcr.io/my-project/app
BASE64_DIGEST=$(echo "$(echo -n $IMAGE | cut -d ':' -f2) $(echo $IMAGE | cut -d '@' -f1)" | base64 -w0) Once you do that I think you should be able to use the attestation returned from the generic workflow as is. So you wouldn't need to strip the predicate out or run |
@chipzoller |
I can, or this can just be one rule with multiple of those expressions falling under the
It does work, but it just sets the subject as the following: "subject": [
{
"name": "ghcr.io/chipzoller/zulu@sha256:5365f368065f3e93629b71b404d75c03154be84ed9853a2ea6739d6994a1993e",
"digest": {
"sha256": "5365f368065f3e93629b71b404d75c03154be84ed9853a2ea6739d6994a1993e"
}
}
] I know this can be adapted by emulate what Your workflow is basically the same as mine just minus the blob upload part. It would be good to provide an input to the finished container workflow which allows users to control the name of the attestation file that gets uploaded. |
Yeah, I'll need to check what Kyverno does when validating. It might use the name & digest from the subject, though I'm not sure if that's the right practice. In any case, at least for our examples in the docs I think we would want to emulate what
I'm not sure that the file name really makes a difference since the container registry isn't really a file server. I think it's more like a blob store with labels and we just need to make sure that it's uploaded with the same tags/labels but I'm not a container registry protocol expert. BTW, some folks kindly pointed out that |
Note that for keyless, you need to verify that the certificate contains the trusted builder (see image https://github.com/slsa-framework/slsa-github-generator/blob/main/SPECIFICATIONS.md#detailed-steps).
Please let me know if that's not making sense.
yes we will use this either via API or via CLI (like we do in the ko PoC)
most of the cosign uses with containers currently do not query rekor and rely on a bundle that contains a signature from rekor. I think it's up to to the verification engine to do this, and our provenance need not change. We could ask the maintainers of Kyverno to add an option if it does not exist. /cc @asraa |
But it does because it will only proceed to verify the provenance if the attestors are verified. And as I stated in the comment for these policies, it is expected that the subject is replaced by the user's "parent" (trusted) builder workflow. |
gotcha, sorry I missed the comment then. I only saw
Can you link to the comment? |
That is the comment I meant. The subject gets set to the workflow the user has as the parent workflow making the call to the SLSA generator workflow. It doesn't get set to the SLSA workflow. Or am I misunderstanding your comment? |
Verifying the user workflow does not prove that the trusted builder was called. We need to verify the certificate field that attests to the trusted builder instead. I was assuming it was "subject", but it may be "Subject Alternative Name"'s URI then (given the image in https://github.com/slsa-framework/slsa-github-generator/blob/main/SPECIFICATIONS.md#detailed-steps). You can see it used in our verifier in https://github.com/slsa-framework/slsa-verifier/blob/main/pkg/provenance.go#L496 |
Ok, I see what you mean. Yes, this is a SAN field. $ COSIGN_EXPERIMENTAL=1 cosign verify ghcr.io/chipzoller/zulu:latest | jq -r .[].optional.Bundle.Payload.body | base64 --decode | jq -r .spec.signature.publicKey.content | base64 --decode | step certificate inspect -
Verification for ghcr.io/chipzoller/zulu:latest --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- Existence of the claims in the transparency log was verified offline
- Any certificates were verified against the Fulcio roots.
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 522184968399268816520144771357179810204483628558 (0x5b77957518196e2902a8b833417f7c595f90ae0e)
Signature Algorithm: ECDSA-SHA384
Issuer: O=sigstore.dev,CN=sigstore-intermediate
Validity
Not Before: Jun 21 14:00:16 2022 UTC
Not After : Jun 21 14:10:16 2022 UTC
Subject:
Subject Public Key Info:
Public Key Algorithm: ECDSA
Public-Key: (256 bit)
X:
18:0b:78:5d:ca:df:8e:01:e6:d3:fc:9d:bb:34:54:
a8:4a:be:d8:c8:b8:c4:bf:7e:4b:8f:2a:89:ec:76:
77:f3
Y:
55:b1:ff:a7:66:1d:2f:9f:d4:91:23:00:a8:85:0d:
9a:af:d1:b0:b3:99:05:62:43:c7:35:15:e1:35:89:
a7:19
Curve: P-256
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature
X509v3 Extended Key Usage:
Code Signing
X509v3 Subject Key Identifier:
C5:66:26:3F:34:96:BF:B6:45:8D:E6:49:A2:80:94:81:6A:3E:12:79
X509v3 Authority Key Identifier:
keyid:DF:D3:E9:CF:56:24:11:96:F9:A8:D8:E9:28:55:A2:C6:2E:18:64:3F
X509v3 Subject Alternative Name: critical
URI:https://github.com/chipzoller/zulu/.github/workflows/slsa-generic-keyless.yaml@refs/heads/main
1.3.6.1.4.1.57264.1.1:
https://token.actions.githubusercontent.com
1.3.6.1.4.1.57264.1.2:
push
1.3.6.1.4.1.57264.1.3:
836faeca5cf505bd6d9e35a6564847bd53aafd51
1.3.6.1.4.1.57264.1.4:
slsa-generic-keyless
1.3.6.1.4.1.57264.1.5:
chipzoller/zulu
1.3.6.1.4.1.57264.1.6:
refs/heads/main
RFC6962 Certificate Transparency SCT:
SCT [0]:
Version: V1 (0x0)
LogID: CGCS8ChS/2hF0dFrJ4ScRWcYrBY9wzjSbea8IgY2b3I=
Timestamp: Jun 21 14:00:16.286 2022 UTC
Signature Algorithm: SHA256-ECDSA
30:46:02:21:00:a4:2b:e3:17:31:1e:aa:51:3c:93:00:0b:09:
36:a7:c5:c7:8d:99:f5:7e:14:40:de:19:10:bb:cf:2e:53:88:
0d:02:21:00:95:93:89:9f:7a:59:d0:cf:a5:eb:12:c4:8d:e8:
98:53:e0:c9:a4:a8:0c:b3:90:1f:70:29:74:37:45:68:c4:d3
Signature Algorithm: ECDSA-SHA384
30:66:02:31:00:98:03:86:aa:a1:a1:79:f1:b5:0a:96:c8:c2:
8c:3f:fc:e7:0f:3a:dc:0a:33:df:24:a6:90:0f:dc:d5:8f:19:
d0:0f:e0:8d:29:c7:e0:be:4b:3f:11:b7:18:12:06:ee:5f:02:
31:00:e4:89:6d:6f:9e:92:bc:a9:15:8c:a1:3e:43:af:c5:e5:
aa:0a:9a:ed:17:d2:1d:d7:ea:9b:2c:a9:33:01:96:80:6e:ba:
16:03:37:60:e9:03:27:08:af:86:6b:4e:f2:bd |
Yeah in @chipzoller 's example he's stripping out the predicate and resigning the provenance which I assume updates the subject in the key because in his case cosign is being executed in the context of the user workflow. |
BTW, This example for the generic workflow works now. I think I'm going to use this as an example workflow for building and generating provenance for containers using the generic reusable workflow. I'm planning on testing how the attestation is verified by Kyverno on Monday but I think it should work as advertised. |
I just tested by modifying my workflow, and I'm not seeing the provenance returned with a Decoded attestation provided below from the prov. generator after modification: Click to expand{
"_type": "https://in-toto.io/Statement/v0.1",
"predicateType": "https://slsa.dev/provenance/v0.2",
"subject": [
{
"name": "ghcr.io/chipzoller/zulu",
"digest": {
"sha256": "76300503a3cb5bfd1bdab04114ba68c26da449a33ed5d4f7afab374cb36cd0a6"
}
}
],
"predicate": {
"builder": {
"id": "https://github.com/slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@refs/tags/v1.1.0"
},
"buildType": "https://github.com/slsa-framework/slsa-github-generator@v1",
"invocation": {
"configSource": {
"uri": "git+https://github.com/chipzoller/zulu@refs/heads/main",
"digest": {
"sha1": "2342d65d70ab3af2ac3159e6fae8078534d6717b"
},
"entryPoint": ".github/workflows/slsa-generic-keyless.yaml"
},
"parameters": {},
"environment": {
"github_actor": "chipzoller",
"github_actor_id": "29008123",
"github_base_ref": "",
"github_event_name": "push",
"github_event_payload": {
"after": "2342d65d70ab3af2ac3159e6fae8078534d6717b",
"base_ref": null,
"before": "1c3a746af484ec5c61a3c4e156f757caa0b5b639",
"commits": [
{
"author": {
"email": "chipzoller@gmail.com",
"name": "Chip Zoller",
"username": "chipzoller"
},
"committer": {
"email": "chipzoller@gmail.com",
"name": "Chip Zoller",
"username": "chipzoller"
},
"distinct": true,
"id": "2342d65d70ab3af2ac3159e6fae8078534d6717b",
"message": "attach\n\nSigned-off-by: Chip Zoller <chipzoller@gmail.com>",
"timestamp": "2022-06-24T12:27:31-04:00",
"tree_id": "dc793f43756c68f878e1ee0e4d99158fa9b4292b",
"url": "https://github.com/chipzoller/zulu/commit/2342d65d70ab3af2ac3159e6fae8078534d6717b"
}
],
"compare": "https://github.com/chipzoller/zulu/compare/1c3a746af484...2342d65d70ab",
"created": false,
"deleted": false,
"forced": false,
"head_commit": {
"author": {
"email": "chipzoller@gmail.com",
"name": "Chip Zoller",
"username": "chipzoller"
},
"committer": {
"email": "chipzoller@gmail.com",
"name": "Chip Zoller",
"username": "chipzoller"
},
"distinct": true,
"id": "2342d65d70ab3af2ac3159e6fae8078534d6717b",
"message": "attach\n\nSigned-off-by: Chip Zoller <chipzoller@gmail.com>",
"timestamp": "2022-06-24T12:27:31-04:00",
"tree_id": "dc793f43756c68f878e1ee0e4d99158fa9b4292b",
"url": "https://github.com/chipzoller/zulu/commit/2342d65d70ab3af2ac3159e6fae8078534d6717b"
},
"pusher": {
"email": "chipzoller@gmail.com",
"name": "chipzoller"
},
"ref": "refs/heads/main",
"repository": {
"allow_forking": true,
"archive_url": "https://api.github.com/repos/chipzoller/zulu/{archive_format}{/ref}",
"archived": false,
"assignees_url": "https://api.github.com/repos/chipzoller/zulu/assignees{/user}",
"blobs_url": "https://api.github.com/repos/chipzoller/zulu/git/blobs{/sha}",
"branches_url": "https://api.github.com/repos/chipzoller/zulu/branches{/branch}",
"clone_url": "https://github.com/chipzoller/zulu.git",
"collaborators_url": "https://api.github.com/repos/chipzoller/zulu/collaborators{/collaborator}",
"comments_url": "https://api.github.com/repos/chipzoller/zulu/comments{/number}",
"commits_url": "https://api.github.com/repos/chipzoller/zulu/commits{/sha}",
"compare_url": "https://api.github.com/repos/chipzoller/zulu/compare/{base}...{head}",
"contents_url": "https://api.github.com/repos/chipzoller/zulu/contents/{+path}",
"contributors_url": "https://api.github.com/repos/chipzoller/zulu/contributors",
"created_at": 1655150913,
"default_branch": "main",
"deployments_url": "https://api.github.com/repos/chipzoller/zulu/deployments",
"description": "Experimental SLSA provenance generation",
"disabled": false,
"downloads_url": "https://api.github.com/repos/chipzoller/zulu/downloads",
"events_url": "https://api.github.com/repos/chipzoller/zulu/events",
"fork": false,
"forks": 1,
"forks_count": 1,
"forks_url": "https://api.github.com/repos/chipzoller/zulu/forks",
"full_name": "chipzoller/zulu",
"git_commits_url": "https://api.github.com/repos/chipzoller/zulu/git/commits{/sha}",
"git_refs_url": "https://api.github.com/repos/chipzoller/zulu/git/refs{/sha}",
"git_tags_url": "https://api.github.com/repos/chipzoller/zulu/git/tags{/sha}",
"git_url": "git://github.com/chipzoller/zulu.git",
"has_downloads": true,
"has_issues": true,
"has_pages": false,
"has_projects": true,
"has_wiki": true,
"homepage": "",
"hooks_url": "https://api.github.com/repos/chipzoller/zulu/hooks",
"html_url": "https://github.com/chipzoller/zulu",
"id": 503099854,
"is_template": false,
"issue_comment_url": "https://api.github.com/repos/chipzoller/zulu/issues/comments{/number}",
"issue_events_url": "https://api.github.com/repos/chipzoller/zulu/issues/events{/number}",
"issues_url": "https://api.github.com/repos/chipzoller/zulu/issues{/number}",
"keys_url": "https://api.github.com/repos/chipzoller/zulu/keys{/key_id}",
"labels_url": "https://api.github.com/repos/chipzoller/zulu/labels{/name}",
"language": "Go",
"languages_url": "https://api.github.com/repos/chipzoller/zulu/languages",
"license": null,
"master_branch": "main",
"merges_url": "https://api.github.com/repos/chipzoller/zulu/merges",
"milestones_url": "https://api.github.com/repos/chipzoller/zulu/milestones{/number}",
"mirror_url": null,
"name": "zulu",
"node_id": "R_kgDOHfyxzg",
"notifications_url": "https://api.github.com/repos/chipzoller/zulu/notifications{?since,all,participating}",
"open_issues": 0,
"open_issues_count": 0,
"owner": {
"avatar_url": "https://avatars.githubusercontent.com/u/29008123?v=4",
"email": "chipzoller@gmail.com",
"events_url": "https://api.github.com/users/chipzoller/events{/privacy}",
"followers_url": "https://api.github.com/users/chipzoller/followers",
"following_url": "https://api.github.com/users/chipzoller/following{/other_user}",
"gists_url": "https://api.github.com/users/chipzoller/gists{/gist_id}",
"gravatar_id": "",
"html_url": "https://github.com/chipzoller",
"id": 29008123,
"login": "chipzoller",
"name": "chipzoller",
"node_id": "MDQ6VXNlcjI5MDA4MTIz",
"organizations_url": "https://api.github.com/users/chipzoller/orgs",
"received_events_url": "https://api.github.com/users/chipzoller/received_events",
"repos_url": "https://api.github.com/users/chipzoller/repos",
"site_admin": false,
"starred_url": "https://api.github.com/users/chipzoller/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/chipzoller/subscriptions",
"type": "User",
"url": "https://api.github.com/users/chipzoller"
},
"private": false,
"pulls_url": "https://api.github.com/repos/chipzoller/zulu/pulls{/number}",
"pushed_at": 1656088077,
"releases_url": "https://api.github.com/repos/chipzoller/zulu/releases{/id}",
"size": 7070,
"ssh_url": "git@github.com:chipzoller/zulu.git",
"stargazers": 1,
"stargazers_count": 1,
"stargazers_url": "https://api.github.com/repos/chipzoller/zulu/stargazers",
"statuses_url": "https://api.github.com/repos/chipzoller/zulu/statuses/{sha}",
"subscribers_url": "https://api.github.com/repos/chipzoller/zulu/subscribers",
"subscription_url": "https://api.github.com/repos/chipzoller/zulu/subscription",
"svn_url": "https://github.com/chipzoller/zulu",
"tags_url": "https://api.github.com/repos/chipzoller/zulu/tags",
"teams_url": "https://api.github.com/repos/chipzoller/zulu/teams",
"topics": [],
"trees_url": "https://api.github.com/repos/chipzoller/zulu/git/trees{/sha}",
"updated_at": "2022-06-20T01:55:18Z",
"url": "https://github.com/chipzoller/zulu",
"visibility": "public",
"watchers": 1,
"watchers_count": 1
},
"sender": {
"avatar_url": "https://avatars.githubusercontent.com/u/29008123?v=4",
"events_url": "https://api.github.com/users/chipzoller/events{/privacy}",
"followers_url": "https://api.github.com/users/chipzoller/followers",
"following_url": "https://api.github.com/users/chipzoller/following{/other_user}",
"gists_url": "https://api.github.com/users/chipzoller/gists{/gist_id}",
"gravatar_id": "",
"html_url": "https://github.com/chipzoller",
"id": 29008123,
"login": "chipzoller",
"node_id": "MDQ6VXNlcjI5MDA4MTIz",
"organizations_url": "https://api.github.com/users/chipzoller/orgs",
"received_events_url": "https://api.github.com/users/chipzoller/received_events",
"repos_url": "https://api.github.com/users/chipzoller/repos",
"site_admin": false,
"starred_url": "https://api.github.com/users/chipzoller/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/chipzoller/subscriptions",
"type": "User",
"url": "https://api.github.com/users/chipzoller"
}
},
"github_head_ref": "",
"github_ref": "refs/heads/main",
"github_ref_type": "branch",
"github_repository_id": "503099854",
"github_repository_owner": "chipzoller",
"github_repository_owner_id": "29008123",
"github_run_attempt": "1",
"github_run_id": "2556932297",
"github_run_number": "7",
"github_sha1": "2342d65d70ab3af2ac3159e6fae8078534d6717b"
}
},
"metadata": {
"buildInvocationID": "2556932297-1",
"completeness": {
"parameters": true,
"environment": false,
"materials": false
},
"reproducible": false
},
"materials": [
{
"uri": "git+https://github.com/chipzoller/zulu@refs/heads/main",
"digest": {
"sha1": "2342d65d70ab3af2ac3159e6fae8078534d6717b"
}
}
]
}
} |
@laurentsimon per comment from @JimBugwadia here, it looks like the |
Hmm, I'll need to investigate later 📝 Manual verification may be tricky since I'm using keyless in the generic workflow. |
I do see that |
I ended up logging sigstore/cosign#2027 for this. |
@chipzoller BTW, I was able to verify an attestation that I created with a local key using
|
Yes, the problem is with keyless mode. |
other examples to provide:
|
We should definitely have an example using ko, jib, etc. Added #947 and #948 for ko and jib examples.
The current getting started doc demonstrates using
I'm not sure I really want to recommend going this route as getting the image digest is not a good experience. |
I think I want to track this on individual issues for each example so I'm going to close this issue. Outstanding tasks to write examples are tracked in these issues:
|
The text was updated successfully, but these errors were encountered: