[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H0XWWCY535KMDSVRYYFR02":3,"skill-same:01M6H0XWWCY535KMDSVRYYFR02":83},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":16,"sourceHtmlUrl":17,"categories":18,"keywords":24,"publishedAt":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":52,"ownerDescription":53,"updatedAt":54,"install":55,"resources":68},"01M6H0XWWCY535KMDSVRYYFR02","verify-image-signature-before-running",null,"Use when an image from a registry must be proven to come from your pipeline before it runs. Verifies a cosign\u002FNotation signature against a keyless identity or a public key and refuses unsigned images.","jiayaoqijia\u002Fcryptoskill","jiayaoqijia","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1453879?v=4","01M6GMYTX7Q7S504VC6E756ENR","YQ","01M6GMYV1QKJ1CC75MTTGT9PR0",81,"MIT","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-image-signature-before-running\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-image-signature-before-running\u002FSKILL.md",[19],{"categoryNo":20,"categoryName":21,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"image","verify","verify image signature before running","running","identity","registry","pipeline","cosign","keyless","public","use","images","it","notation","public key","when","2026-11-10 10:12:30",false,"---\nname: verify-image-signature-before-running\ndescription: Use when an image from a registry must be proven to come from your pipeline before it runs. Verifies a cosign\u002FNotation signature against a keyless identity or a public key and refuses unsigned images.\n---\n\n# Verify Image Signature Before Running\n\nA digest proves the bytes did not change; it does not prove who produced them. Signature verification binds an image to a signing identity (a KMS key or a CI OIDC workflow), so a digest pulled from a compromised or typosquatted registry is rejected before it starts.\n\n## Procedure\n\n1. Sign in the pipeline after push, keyless against the workflow identity:\n   `cosign sign --yes ghcr.io\u002Facme\u002Fapp@sha256:9f2c...c41`.\n2. Verify against that identity before deploy to a dev cluster:\n   ```bash\n   cosign verify ghcr.io\u002Facme\u002Fapp@sha256:9f2c...c41 \\\n     --certificate-identity-regexp '^https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\u002F.github\u002Fworkflows\u002Frelease.yml@refs\u002Ftags\u002F.*$' \\\n     --certificate-oidc-issuer https:\u002F\u002Ftoken.actions.githubusercontent.com\n   ```\n3. For a key-based setup, verify with the public key and reject if it is absent:\n   `cosign verify --key cosign.pub ghcr.io\u002Facme\u002Fapp@sha256:9f2c...c41`.\n4. Enforce at admission so an unsigned image cannot schedule. With Kyverno:\n   ```yaml\n   verifyImages:\n     - imageReferences: [\"ghcr.io\u002Facme\u002F*\"]\n       attestors: [{ entries: [{ keyless: { subject: \"https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\u002F...\", issuer: \"https:\u002F\u002Ftoken.actions.githubusercontent.com\" } }] }]\n   ```\n5. Also verify the SBOM\u002Fattestation if you produce one:\n   `cosign verify-attestation --type spdxjson --key cosign.pub ghcr.io\u002Facme\u002Fapp@sha256:...`.\n6. Pin the exact `--certificate-identity-regexp`; a regexp of `.*` accepts anyone's OIDC identity, which defeats the check.\n7. For Notation\u002FORAS workflows, `notation verify ghcr.io\u002Facme\u002Fapp@sha256:...` with a trust policy in `~\u002F.config\u002Fnotation\u002Ftrustpolicy.json`.\n\n## Pitfalls\n\n- Verifying the tag rather than the digest lets the signature attach to one image while you deploy another resolved later; always verify the `@sha256` you will run.\n- In keyless mode, `--certificate-identity-regexp` broad enough to include a fork or any repo under the org is a real bypass; anchor the path and the tag\u002Fref pattern.\n- A signature covers the manifest, not the config or layers transitively in all schemes — verify the whole index and pull by digest so the covered object is what runs.\n- `cosign verify` prints JSON and exits 0\u002F1; a pipeline that pipes to `jq` and swallows the exit code runs unsigned images. Check `$?`.\n- Signing with a long-lived key stored next to the build script is not a trust boundary; use OIDC keyless or a KMS\u002FHSM key.\n- Registry mirrors and re-tagging do not carry signatures; an image promoted by copying layers into another registry is unsigned unless re-signed.\n- Rekor transparency log absence is not itself a failure, but record the entry index so a later dispute can be checked.\n\n## Verification\n\n    cosign verify --certificate-identity-regexp '\u003Canchored>' \\\n      --certificate-oidc-issuer https:\u002F\u002Ftoken.actions.githubusercontent.com \\\n      ghcr.io\u002Facme\u002Fapp@sha256:9f2c...c41 >\u002Fdev\u002Fnull && echo SIGNED\n    # SIGNED ; an unsigned or wrong-identity image exits non-zero\n\nThe verify command exits 0 only for the expected signer, and admission blocks a re-pushed unsigned tag. Report the verified identity and the policy that enforced it.\n","# Verify Image Signature Before Running\n\nA digest proves the bytes did not change; it does not prove who produced them. Signature verification binds an image to a signing identity (a KMS key or a CI OIDC workflow), so a digest pulled from a compromised or typosquatted registry is rejected before it starts.\n\n## Procedure\n\n1. Sign in the pipeline after push, keyless against the workflow identity:\n   `cosign sign --yes ghcr.io\u002Facme\u002Fapp@sha256:9f2c...c41`.\n2. Verify against that identity before deploy to a dev cluster:\n   ```bash\n   cosign verify ghcr.io\u002Facme\u002Fapp@sha256:9f2c...c41 \\\n     --certificate-identity-regexp '^https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\u002F.github\u002Fworkflows\u002Frelease.yml@refs\u002Ftags\u002F.*$' \\\n     --certificate-oidc-issuer https:\u002F\u002Ftoken.actions.githubusercontent.com\n   ```\n3. For a key-based setup, verify with the public key and reject if it is absent:\n   `cosign verify --key cosign.pub ghcr.io\u002Facme\u002Fapp@sha256:9f2c...c41`.\n4. Enforce at admission so an unsigned image cannot schedule. With Kyverno:\n   ```yaml\n   verifyImages:\n     - imageReferences: [\"ghcr.io\u002Facme\u002F*\"]\n       attestors: [{ entries: [{ keyless: { subject: \"https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\u002F...\", issuer: \"https:\u002F\u002Ftoken.actions.githubusercontent.com\" } }] }]\n   ```\n5. Also verify the SBOM\u002Fattestation if you produce one:\n   `cosign verify-attestation --type spdxjson --key cosign.pub ghcr.io\u002Facme\u002Fapp@sha256:...`.\n6. Pin the exact `--certificate-identity-regexp`; a regexp of `.*` accepts anyone's OIDC identity, which defeats the check.\n7. For Notation\u002FORAS workflows, `notation verify ghcr.io\u002Facme\u002Fapp@sha256:...` with a trust policy in `~\u002F.config\u002Fnotation\u002Ftrustpolicy.json`.\n\n## Pitfalls\n\n- Verifying the tag rather than the digest lets the signature attach to one image while you deploy another resolved later; always verify the `@sha256` you will run.\n- In keyless mode, `--certificate-identity-regexp` broad enough to include a fork or any repo under the org is a real bypass; anchor the path and the tag\u002Fref pattern.\n- A signature covers the manifest, not the config or layers transitively in all schemes — verify the whole index and pull by digest so the covered object is what runs.\n- `cosign verify` prints JSON and exits 0\u002F1; a pipeline that pipes to `jq` and swallows the exit code runs unsigned images. Check `$?`.\n- Signing with a long-lived key stored next to the build script is not a trust boundary; use OIDC keyless or a KMS\u002FHSM key.\n- Registry mirrors and re-tagging do not carry signatures; an image promoted by copying layers into another registry is unsigned unless re-signed.\n- Rekor transparency log absence is not itself a failure, but record the entry index so a later dispute can be checked.\n\n## Verification\n\n    cosign verify --certificate-identity-regexp '\u003Canchored>' \\\n      --certificate-oidc-issuer https:\u002F\u002Ftoken.actions.githubusercontent.com \\\n      ghcr.io\u002Facme\u002Fapp@sha256:9f2c...c41 >\u002Fdev\u002Fnull && echo SIGNED\n    # SIGNED ; an unsigned or wrong-identity image exits non-zero\n\nThe verify command exits 0 only for the expected signer, and admission blocks a re-pushed unsigned tag. Report the verified identity and the policy that enforced it.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-verify-image-signature-before-running",17,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia","https:\u002F\u002Feth2030.com","Hardcore infra. Building @alt-research and applied cryptography.","2026-11-14 02:27:51",{"source":8,"skillName":5,"commands":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill verify-image-signature-before-running",{"tool":61,"command":62},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill verify-image-signature-before-running",{"tool":64,"command":65},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill verify-image-signature-before-running","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-image-signature-before-running\u002FSKILL.md",true,[69,73,79],{"path":70,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"SOURCE.md","REFERENCE","参考文档",363,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-image-signature-before-running\u002FSOURCE.md",{"path":80,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":81,"sourceHtmlUrl":82},"TRUST.auto.yaml",2191,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-image-signature-before-running\u002FTRUST.auto.yaml",[84,112,134,152,165,175],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":88,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":41},"01M712C436EQYE43342Q4E7GG1","recipe-performance","Diagnose a specific MetaMask user flow's real-app performance and Sentry critical-user-flow telemetry with deterministic mm-harness recipes. Use for CUF boundaries, cold\u002Fwarm\u002Fbackground-resume behavior, latency regressions, lifecycle tags, duplicate or blocking network requests, long tasks, layout\u002Fpaint cost, screen redraws, React rerenders, or browser trace analysis where tests alone cannot prove the real app.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FSKILL.md",[],[92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":116,"licenseFileUrl":117,"sourceHtmlUrl":118,"categories":119,"keywords":120,"publishedAt":41},"01M70XT2F8A5CQZ81JBP98KSW3","mexc-spot-websocket","MEXC Spot WebSocket workflows for public streams, protobuf handling, depth maintenance, listen keys, and private streams without exposing API keys.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FSKILL.md",[],[121,122,123,124,125,34,126,127,128,129,130,131,132,133],"mexc spot websocket","spot","websocket","api","workflows","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":116,"licenseFileUrl":138,"sourceHtmlUrl":139,"categories":140,"keywords":141,"publishedAt":41},"01M70XT0MBXN3WZY1BKN0CPNKR","mexc-spot-rest","MEXC Spot REST workflows for public data, signed account requests, orders, wallet\u002Fadmin actions, and secure signing without exposing API keys.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FSKILL.md",[],[142,122,143,144,145,146,147,131,130,129,148,149,150,34,151,125,124],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","data","orders",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":116,"licenseFileUrl":156,"sourceHtmlUrl":157,"categories":158,"keywords":159,"publishedAt":41},"01M70XSYSVZ2N0N91XCAR2CAK0","mexc-futures-websocket","MEXC Futures WebSocket workflows for public streams, private account\u002Forder\u002Fposition streams, ping\u002Fpong, subscriptions, and depth maintenance.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FSKILL.md",[],[160,161,123,162,163,132,130,164,128,127,34,125],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":166,"name":167,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":168,"sourceHtmlUrl":169,"categories":170,"keywords":171,"publishedAt":41},"01M6H0ZWHVE5W04WG2DKQE2SQC","0xklen-version-and-refresh-sanctions-lists","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FSKILL.md",[],[172,173,174],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":176,"name":177,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":179,"sourceHtmlUrl":180,"categories":181,"keywords":182,"publishedAt":41},"01M6H0Z28Q3R8J0S799GJQWXM3","verify-tests-cover-changed-lines","Use when a PR adds code that the existing suite may not exercise. Measures patch coverage — the share of newly changed lines hit by tests — before approving.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FSKILL.md",[],[183,184,185,26,186,187,188,35,189,190,191],"tests","cover","verify tests cover changed lines","coverage","pr","exercise","patch","code","share"]