Сообщение об ошибке
--certificate-identity or --certificate-identity-regexp is required for verification in keyless mode
Также выводится как
- Error: --certificate-identity or --certificate-identity-regexp is required for verification in keyless mode
cosign также требует `--certificate-oidc-issuer` (или `--certificate-oidc-issuer-regexp`); флаг удостоверения проверяется первым. cosign 1.x допускал проверку без ключа и без этих флагов.
Sigstore cosign 2.x/3.x — verify / verify-blob / verify-attestation without --key
Что это означает
Без `--key` cosign проверяет подписи без ключа («keyless»): краткосрочный сертификат от Fulcio привязывает подпись к удостоверению OIDC (workflow в CI, адрес электронной почты). Верная подпись без ключа доказывает лишь то, что подписал *кто-то* с *каким-то* удостоверением — поэтому cosign 2.0 и новее требует явно указать, чью подпись вы принимаете. Пока вы не укажете ожидаемые удостоверение и издателя, команда останавливается ещё до чтения бандла.
Почему это происходит
Команды из документации cosign 1.x
частоВ 1.x команда `COSIGN_EXPERIMENTAL=1 cosign verify image` работала и принимала любое удостоверение. В пайплайне на 2.x/3.x та же скопированная команда завершается этой ошибкой.
Вы ещё не знаете удостоверение подписанта
частоУдостоверение — это SAN сертификата: для GitHub Actions — URL workflow вместе с его ref, для интерактивной подписи — адрес электронной почты. Проекты указывают его в документации рядом с инструкциями по проверке.
Артефакт, подписанный ключом, проверяется без --key
иногдаЕсли артефакт подписан с помощью пары ключей, передайте `--key cosign.pub`; тогда флаги удостоверения не нужны.
Как исправить
- 1.
Закрепите удостоверение workflow и издателя
Для GitHub Actions издатель — `https://token.actions.githubusercontent.com`, а удостоверение — файл workflow с указанием ref.
bash # Artifacts signed in GitHub Actions: identity = workflow file at a ref, issuer = GitHub's OIDC issuer cosign verify-blob \ --bundle app.sigstore.json \ --certificate-identity "https://github.com/acme/app/.github/workflows/release.yml@refs/tags/v1.4.2" \ --certificate-oidc-issuer "https://token.actions.githubusercontent.com" \ app.tar.gz - 2.
Для диапазонов используйте регулярное выражение с якорями
`--certificate-identity-regexp` позволяет принимать все теги одного workflow. Ограничьте выражение якорями, иначе под него может подойти workflow из форка.
bash # Any release tag of that workflow - anchor the expression cosign verify ghcr.io/acme/app:1.4.2 \ --certificate-identity-regexp '^https://github\.com/acme/app/\.github/workflows/release\.yml@refs/tags/v[0-9]+\.[0-9]+\.[0-9]+$' \ --certificate-oidc-issuer https://token.actions.githubusercontent.com - 3.
Прочитайте удостоверение из сертификата
Закреплять нужно значение альтернативного имени субъекта (SAN) из сертификата в бандле — после того как вы решите, что доверяете именно этому удостоверению.
bash # Read the identity recorded in the signing certificate of a bundle jq -r '.verificationMaterial.certificate.rawBytes' app.sigstore.json | base64 -d \ | openssl x509 -inform DER -noout -ext subjectAltName