Voltar às atualizações
New releaseAug 6, 2026

cosign v3.1.3

Assinatura de código e transparência para contêineres e binários

Compartilhar

Logotipo do Cosign

cosign

Assinando contêineres OCI (e outros artefatos) usando Sigstore!

Go Report Card e2e-tests CII Best Practices OpenSSF Scorecard

O Cosign visa tornar as assinaturas uma infraestrutura invisível.

O Cosign suporta:

  • "Assinatura sem chave" com a autoridade certificadora Fulcio de bem público do Sigstore e o log de transparência Rekor (padrão)
  • Assinatura por hardware e KMS
  • Assinatura com um par de chaves privada/pública criptografado gerado pelo cosign
  • Assinatura, verificação e armazenamento de contêineres em um registro OCI.
  • Traga sua própria PKI

Informações

O Cosign é desenvolvido como parte do projeto sigstore. Também usamos um canal no Slack! Clique aqui para o link de convite.

Instalação

Para instalações via Homebrew, Arch, Nix, GitHub Action e Kubernetes, consulte a documentação de instalação.

Para binários Linux e macOS, consulte os ativos de release do GitHub.

🚨 Se você está baixando releases do cosign do nosso bucket GCS - consulte mais informações no aviso de descontinuação de 31 de julho de 2023 🚨

Instalação para Desenvolvedores

Se você tiver Go 1.22+, pode configurar um ambiente de desenvolvimento:```shell $ git clone https://github.com/sigstore/cosign $ cd cosign $ go install ./cmd/cosign $ $(go env GOPATH)/bin/cosign

## Contribuindo

Se você estiver interessado em contribuir com o `cosign`, leia a [documentação de contribuição](https://github.com/sigstore/cosign/blob/HEAD/CONTRIBUTING.md).

O desenvolvimento futuro do Cosign será focado na próxima versão principal, que será baseada em
[sigstore-go](https://github.com/sigstore/sigstore-go). Os mantenedores estarão focados no desenvolvimento de funcionalidades dentro do
sigstore-go. Contribuições para o sigstore-go, especialmente em relação a trazer suas próprias chaves e assinatura, são apreciadas.
Por favor, consulte o [rastreador de issues](https://github.com/sigstore/sigstore-go/issues) para boas primeiras issues.

O Cosign 2.x é uma versão estável e continuará recebendo atualizações periódicas de funcionalidades e correções de bugs. PRs
que sejam pequenos em escopo e tamanho têm maior probabilidade de serem revisados rapidamente.

PRs que modifiquem significativamente ou quebrem a API não serão aceitos. PRs que sejam significativos em tamanho, mas que não
introduzam mudanças que quebrem a compatibilidade podem ser aceitos, mas serão considerados de prioridade menor do que PRs no sigstore-go.

## Dockerfile

Veja como instalar e usar o cosign dentro de um Dockerfile por meio da imagem ghcr.io/sigstore/cosign/cosign:```shell
FROM ghcr.io/sigstore/cosign/cosign:v2.4.1 as cosign-bin

# Source: https://github.com/chainguard-images/static
FROM cgr.dev/chainguard/static:latest
COPY --from=cosign-bin /ko-app/cosign /usr/local/bin/cosign
ENTRYPOINT [ "cosign" ]

Início Rápido

Isto mostra como:

Assinar um contêiner e armazenar a assinatura no registro

Observe que você deve sempre assinar imagens com base no digest (@sha256:...) em vez de uma tag (:latest), pois, caso contrário, você pode assinar algo que não pretendia!```shell cosign sign $IMAGE

Generating ephemeral keys... Retrieving signed certificate...

Note that there may be personally identifiable information associated with this signed artifact.
This may include the email address associated with the account with which you authenticate.
This information will be used for signing this artifact and will be stored in public transparency logs and cannot be removed later.

By typing 'y', you attest that you grant (or have permission to grant) and agree to have this information stored permanently in transparency logs. Are you sure you would like to continue? [y/N] y Your browser will now be opened to: https://oauth2.sigstore.dev/auth/auth?access_type=online&client_id=sigstore&code_challenge=OrXitVKUZm2lEWHVt1oQWR4HZvn0rSlKhLcltglYxCY&code_challenge_method=S256&nonce=2KvOWeTFxYfxyzHtssvlIXmY6Jk&redirect_uri=http%3A%2F%2Flocalhost%3A57102%2Fauth%2Fcallback&response_type=code&scope=openid+email&state=2KvOWfbQJ1caqScgjwibzK2qJmb Successfully verified SCT... tlog entry created with index: 12086900 Pushing signature to: $IMAGE

O Cosign solicitará que você se autentique via OIDC, onde fará login com seu endereço de e-mail.
Nos bastidores, o cosign solicitará um certificado de assinatura de código à autoridade de certificação Fulcio.
O assunto do certificado corresponderá ao endereço de e-mail com o qual você fez login.
O cosign armazenará então a assinatura e o certificado no log de transparência Rekor e enviará a assinatura ao registro OCI juntamente com a imagem que você está assinando.


### Verificar um contêiner

Para verificar a imagem, você precisará informar o assunto do certificado esperado e o emissor do certificado por meio das flags `--certificate-identity` e `--certificate-oidc-issuer`:```
cosign verify $IMAGE --certificate-identity=$IDENTITY --certificate-oidc-issuer=$OIDC_ISSUER

Você também pode passar uma regex para os flags de identidade do certificado e de emissor, --certificate-identity-regexp e --certificate-oidc-issuer-regexp.

Verificar um contêiner contra uma chave pública

Este comando retorna 0 se pelo menos uma assinatura no formato cosign para a imagem for encontrada correspondendo à chave pública. Consulte o uso detalhado abaixo para informações e ressalvas sobre outros formatos de assinatura.

Quaisquer payloads válidos são impressos na stdout, em formato json. Observe que esses payloads assinados incluem o digest da imagem do contêiner, que é como podemos ter certeza de que essas assinaturas "desanexadas" cobrem a imagem correta.```shell $ cosign verify --key cosign.pub $IMAGE_URI:1h The following checks were performed on these signatures:

  • The cosign claims were validated
  • The signatures were verified against the specified public key {"Critical":{"Identity":{"docker-reference":""},"Image":{"Docker-manifest-digest":"sha256:87ef60f558bad79beea6425a3b28989f01dd417164150ab3baab98dcbf04def8"},"Type":"cosign container image signature"},"Optional":null}
### Verificar um contêiner em um ambiente isolado (air-gapped)

**Nota:** Esta seção está desatualizada.

**Nota:** A maioria dos fluxos de trabalho de verificação exige solicitar periodicamente chaves de serviço a um repositório TUF.
Para verificação offline (airgapped) de assinaturas usando a instância de bem público, será necessário obter o arquivo
[trusted root](https://github.com/sigstore/root-signing/blob/main/targets/trusted_root.json) do repositório TUF de
produção. O conteúdo deste arquivo mudará sem aviso prévio. Ao não usar TUF, você precisará
criar seu próprio mecanismo para manter sua cópia offline (airgapped) deste arquivo atualizada.

O Cosign pode fazer verificação completamente offline ao verificar um [bundle](https://github.com/sigstore/cosign/blob/HEAD/specs/SIGNATURE_SPEC.md#properties) que normalmente é distribuído como uma anotação no manifesto da imagem.
Desde que essa anotação esteja presente, a verificação offline pode ser realizada.
Essa anotação de bundle é sempre incluída por padrão para assinatura sem chave (keyless), portanto a funcionalidade padrão de `cosign sign` incluirá todos os materiais necessários para a verificação offline.

Para verificar uma imagem em um ambiente isolado (air-gapped), a imagem e as assinaturas devem estar disponíveis localmente no sistema de arquivos.

Uma imagem pode ser salva localmente usando `cosign save` (observe que esta etapa deve ser feita com uma conexão de rede):```
cosign initialize # This will pull in the latest TUF root
cosign save $IMAGE_NAME --dir ./path/to/dir

Agora, em um ambiente air-gapped, esta imagem local pode ser verificada:```shell cosign verify
--certificate-identity $CERT_IDENTITY
--certificate-oidc-issuer $CERT_OIDC_ISSUER
--offline=true
--new-bundle-format=false \ # for artifacts signed without the new protobuf bundle format --trusted-root ~/.sigstore/root/tuf-repo-cdn.sigstore.dev/targets/trusted_root.json \ # default location of trusted root --local-image ./path/to/dir

Você precisará fornecer os valores esperados para `$CERT_IDENTITY` e `$CERT_OIDC_ISSUER` para verificar corretamente esta imagem.
Se você assinou com um par de chaves, o mesmo comando funcionará, desde que o material da chave pública esteja presente localmente:```
cosign verify --key cosign.pub --offline --local-image ./path/to/dir

Assinatura e verificação de blobs baseada em identidade

Use assinatura de blobs sem chave (cosign sign-blob sem --key) e verifique em relação à identidade esperada do signatário:```shell $ cosign sign-blob artifact --bundle artifact.sigstore.json --yes $ cosign verify-blob artifact
--bundle artifact.sigstore.json
--certificate-identity "https://github.com/ORG/REPO/.github/workflows/release.yml@refs/heads/main"
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"

### Solução de problemas

Se você encontrar problemas com o Cosign, primeiro certifique-se de estar usando uma versão recente: o projeto Cosign oferece suporte ativo à versão mais recente, bem como à última versão da série v2.

#### Problemas comuns e soluções

1. A verificação falha com `failed to verify timestamps: threshold not met for verified log entry integrated timestamps: 0 < 1`: você pode estar verificando uma assinatura que requer suporte a timestamps RFC3161
   * Atualize para a versão mais recente do Cosign ou
   * Com o Cosign 2.6.x, use `--use-signed-timestamps`
1. A verificação falha com `no signatures found`: você pode estar verificando uma assinatura de imagem que requer suporte ao log de transparência Rekor v2
   * Atualize para a versão mais recente do Cosign
1. A assinatura falha com erros HTTP: assinar com o Cosign depende de vários serviços Sigstore. Repetir a operação em caso de falha pode ser uma alternativa útil se algum desses serviços falhar — relatar problemas para falhas específicas também é apreciado

#### Meu problema é outro

Abra uma [issue](https://github.com/sigstore/cosign/issues/new/choose) ou pergunte no [canal do Slack](#info).

## Trabalhando com Outros Artefatos

Os registros OCI são úteis para armazenar muito mais do que apenas imagens de contêiner!
O `Cosign` também inclui alguns utilitários para publicar artefatos genéricos, incluindo binários, scripts e arquivos de configuração usando o protocolo OCI.

Esta seção mostra como aproveitar esses recursos para criar um sistema de distribuição de artefatos fácil de usar e com compatibilidade reversa, que se integra bem ao restante do Sigstore.

Consulte [a documentação](https://docs.sigstore.dev/cosign/signing/other_types/) para obter mais informações.

### Blobs

Você pode publicar um artefato com `cosign upload blob`:```shell
$ echo "my first artifact" > artifact
$ BLOB_SUM=$(shasum -a 256 artifact | cut -d' ' -f 1) && echo "$BLOB_SUM"
c69d72c98b55258f9026f984e4656f0e9fd3ef024ea3fac1d7e5c7e6249f1626
$ BLOB_NAME=my-artifact-$(uuidgen | head -c 8 | tr 'A-Z' 'a-z')
$ BLOB_URI=ttl.sh/$BLOB_NAME:1h

$ BLOB_URI_DIGEST=$(cosign upload blob -f artifact $BLOB_URI) && echo "$BLOB_URI_DIGEST"
Uploading file from [artifact] to [ttl.sh/my-artifact-f42c22e0:5m] with media type [text/plain]
File [artifact] is available directly at [ttl.sh/v2/my-artifact-f42c22e0/blobs/sha256:c69d72c98b55258f9026f984e4656f0e9fd3ef024ea3fac1d7e5c7e6249f1626]
Uploaded image to:
ttl.sh/my-artifact-f42c22e0@sha256:790d47850411e902aabebc3a684eeb78fcae853d4dd6e1cc554d70db7f05f99f

Seus usuários podem baixá-lo a partir do URL "direct" com ferramentas padrão como curl ou wget:```shell $ curl -L ttl.sh/v2/$BLOB_NAME/blobs/sha256:$BLOB_SUM > artifact-fetched

O digest é embutido diretamente na URL, para que possam verificar isso também:```shell
$ cat artifact-fetched | shasum -a 256
c69d72c98b55258f9026f984e4656f0e9fd3ef024ea3fac1d7e5c7e6249f1626  -

Você pode assiná-lo com o comando normal cosign sign e flags:```shell $ cosign sign --key cosign.key $BLOB_URI_DIGEST Enter password for private key: Pushing signature to: ttl.sh/my-artifact-f42c22e0

Como de costume, certifique-se de referenciar qualquer imagem que você assinar pelo seu digest para não assinar a coisa errada!

#### Tekton Bundles

Os bundles do [Tekton](https://tekton.dev) podem ser enviados e gerenciados em um registro OCI.
A especificação está [aqui](https://tekton.dev/docs/pipelines/tekton-bundle-contracts/).
Isso significa que eles também podem ser assinados e verificados com `cosign`.

Atualmente, os bundles Tekton podem ser enviados com a [tkn cli](https://github.com/tektoncd/cli), mas podemos adicionar esse suporte ao `cosign` no futuro.```shell
$ tkn bundle push us.gcr.io/dlorenc-vmtest2/pipeline:latest -f task-output-image.yaml
Creating Tekton Bundle:
        - Added TaskRun:  to image

Pushed Tekton Bundle to us.gcr.io/dlorenc-vmtest2/pipeline@sha256:124e1fdee94fe5c5f902bc94da2d6e2fea243934c74e76c2368acdc8d3ac7155
$ cosign sign --key cosign.key us.gcr.io/dlorenc-vmtest2/pipeline@sha256:124e1fdee94fe5c5f902bc94da2d6e2fea243934c74e76c2368acdc8d3ac7155
Enter password for private key:
tlog entry created with index: 5086
Pushing signature to: us.gcr.io/dlorenc-vmtest2/demo:sha256-124e1fdee94fe5c5f902bc94da2d6e2fea243934c74e76c2368acdc8d3ac7155.sig

WASM

Módulos Web Assembly também podem ser armazenados em um registro OCI, usando esta especificação.

O Cosign pode enviá-los usando o comando cosign wasm upload:```shell $ cosign upload wasm -f hello.wasm us.gcr.io/dlorenc-vmtest2/wasm $ cosign sign --key cosign.key us.gcr.io/dlorenc-vmtest2/wasm@sha256:9e7a511fb3130ee4641baf1adc0400bed674d4afc3f1b81bb581c3c8f613f812 Enter password for private key: tlog entry created with index: 5198 Pushing signature to: us.gcr.io/dlorenc-vmtest2/wasm:sha256-9e7a511fb3130ee4641baf1adc0400bed674d4afc3f1b81bb581c3c8f613f812.sig

#### eBPF

[eBPF](https://ebpf.io) módulos também podem ser armazenados em um registro OCI, usando esta [especificação](https://github.com/solo-io/bumblebee/tree/main/spec).

A imagem abaixo foi construída usando a ferramenta `bee`. Mais informações podem ser encontradas [aqui](https://github.com/solo-io/bumblebee/)

O Cosign pode então assinar essas imagens, como pode assinar qualquer outra imagem OCI.```shell
$ bee build ./examples/tcpconnect/tcpconnect.c localhost:5000/tcpconnect:test
$ bee push localhost:5000/tcpconnect:test
$ cosign sign  --key cosign.key localhost:5000/tcpconnect@sha256:7a91c50d922925f152fec96ed1d84b7bc6b2079c169d68826f6cf307f22d40e6
Enter password for private key:
Pushing signature to: localhost:5000/tcpconnect
$ cosign verify --key cosign.pub localhost:5000/tcpconnect:test

Verification for localhost:5000/tcpconnect:test --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - The signatures were verified against the specified public key

[{"critical":{"identity":{"docker-reference":"localhost:5000/tcpconnect"},"image":{"docker-manifest-digest":"sha256:7a91c50d922925f152fec96ed1d84b7bc6b2079c169d68826f6cf307f22d40e6"},"type":"cosign container image signature"},"optional":null}]

Atestações In-Toto

O Cosign também possui suporte integrado para atestações in-toto. A especificação destas está definida aqui.

Você pode criar e assinar uma a partir de um arquivo de predicado local usando os seguintes comandos:```shell $ cosign attest --predicate --key cosign.key $IMAGE_URI_DIGEST

Todos os sistemas padrão de gerenciamento de chaves são suportados.
Os payloads são assinados usando a especificação de assinatura DSSE, definida [aqui](https://github.com/secure-systems-lab/dsse).

Para verificar:```shell
$ cosign verify-attestation --key cosign.pub $IMAGE_URI

Utilização Detalhada

Consulta a documentação de Utilização para mais informações.

Tokens Baseados em Hardware

Consulta a documentação de Tokens de Hardware para informações sobre como utilizar cosign com hardware.

Suporte de Registries

O cosign utiliza o go-containerregistry para interações com registries, que tem, de forma geral, uma excelente compatibilidade, mas alguns registries podem ter particularidades.

Atualmente, o cosign foi testado e funciona com os seguintes registries:

  • AWS Elastic Container Registry
  • GCP's Artifact Registry e Container Registry
  • Docker Hub
  • Azure Container Registry
  • JFrog Artifactory Container Registry
  • O Registry distribution/distribution da CNCF
  • GitLab Container Registry
  • GitHub Container Registry
  • O Registry Harbor da CNCF
  • Digital Ocean Container Registry
  • Sonatype Nexus Container Registry
  • Alibaba Cloud Container Registry
  • Red Hat Quay Container Registry 3.6+ / Red Hat quay.io
  • Elastic Container Registry
  • IBM Cloud Container Registry
  • Cloudsmith Container Registry
  • O Registry zot da CNCF
  • OVHcloud Managed Private Registry

O nosso objetivo é um amplo suporte de registries. Para assinar imagens em registries que ainda não suportam totalmente os tipos de media OCI, poderá ser necessário usar COSIGN_DOCKER_MEDIA_TYPES para recorrer a equivalentes legados. Por exemplo:```shell COSIGN_DOCKER_MEDIA_TYPES=1 cosign sign --key cosign.key legacy-registry.example.com/my/image@$DIGEST

Ajude a testar e relate bugs se encontrar problemas!
As instruções podem ser encontradas na [issue de acompanhamento](https://github.com/sigstore/cosign/issues/40).

## Ressalvas

### Recursos Intencionalmente Ausentes

O `cosign` gera apenas chaves ECDSA-P256 e usa hashes SHA256, tanto para assinatura keyless efêmera quanto para assinatura com chave gerenciada.
As chaves são armazenadas em formato PKCS8 codificado em PEM.
No entanto, você pode usar o `cosign` para armazenar e recuperar assinaturas em qualquer formato, de qualquer algoritmo.

### Coisas Que Provavelmente Deveriam Mudar

#### Formatos de Payload

O `cosign` suporta apenas o [simple signing](https://www.redhat.com/en/blog/container-image-signing) da Red Hat
para payloads.
Isso se parece com:```json
{
    "critical": {
           "identity": {
               "docker-reference": "testing/manifest"
           },
           "image": {
               "Docker-manifest-digest": "sha256:20be...fe55"
           },
           "type": "cosign container image signature"
    },
    "optional": {
           "creator": "Bob the Builder",
           "timestamp": 1458239713
    }
}

Nota: Isso pode ser gerado para uma referência de imagem usando cosign generate $IMAGE_URI_DIGEST.

Fico feliz em mudar este formato para outra coisa, se fizer sentido. Veja https://github.com/notaryproject/nv2/issues/40 para uma opção.

Detalhes do Registro

As assinaturas do cosign são armazenadas como objetos separados no registro OCI, com apenas uma referência fraca de volta ao objeto que elas "assinam". Isso significa que essa relação é opaca ao registro, e as assinaturas não serão excluídas nem coletadas como lixo quando a imagem for excluída. Da mesma forma, elas podem ser facilmente copiadas de um ambiente para outro, mas isso não é automático.

Várias assinaturas são armazenadas em uma lista, o que infelizmente é uma condição de corrida atualmente. Para adicionar uma assinatura, os clientes orquestram uma operação "read-append-write", de modo que a última gravação vence em caso de contenção.

Especificando o Registro

Por padrão, o cosign armazenará as assinaturas no mesmo repositório da imagem que está assinando. Para especificar um repositório diferente para as assinaturas, você pode definir a variável de ambiente COSIGN_REPOSITORY.

Isso substituirá o repositório na imagem fornecida da seguinte forma:```shell $ export COSIGN_REPOSITORY=gcr.io/my-new-repo $ cosign sign --key cosign.key $IMAGE_URI_DIGEST

Portanto, a assinatura para `gcr.io/dlorenc-vmtest2/demo` será armazenada em `gcr.io/my-new-repo/demo:sha256-DIGEST.sig`.

Nota: registros diferentes podem esperar formatos diferentes para o "repositório".

* Para usar o [GCR](https://cloud.google.com/container-registry), um nome de registro
  como `gcr.io/$REPO` é suficiente, como no exemplo acima.
* Para usar o [Artifact Registry](https://cloud.google.com/artifact-registry),
  especifique um nome de imagem completo como
  `$LOCATION-docker.pkg.dev/$PROJECT/$REPO/$STORAGE_IMAGE`, não apenas um
  repositório. Por exemplo,  ```shell
  $ export COSIGN_REPOSITORY=us-docker.pkg.dev/my-new-repo/demo
  $ cosign sign --key cosign.key $IMAGE_URI_DIGEST

onde o sha256-DIGEST corresponderá ao digest de gcr.io/dlorenc-vmtest2/demo. Especificar apenas um repositório como $LOCATION-docker.pkg.dev/$PROJECT/$REPO não funcionará no Artifact Registry.

Especificação de Assinatura

O cosign é inspirado em ferramentas como minisign e signify.

As chaves privadas geradas são armazenadas no formato PEM. As chaves são criptografadas com uma senha usando scrypt como KDF e nacl/secretbox para criptografia.

Elas têm um cabeçalho PEM de ENCRYPTED SIGSTORE PRIVATE KEY:```shell -----BEGIN ENCRYPTED SIGSTORE PRIVATE KEY----- ... -----END ENCRYPTED SIGSTORE PRIVATE KEY-----

As chaves públicas são armazenadas em disco no formato PKIX padrão codificado em PEM, com um cabeçalho de `PUBLIC KEY`.```
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELigCnlLNKgOglRTx1D7JhI7eRw99
QolE9Jo4QUxnbMy5nUuBL+UZF9qqfm/Dg1BNeHRThHzWh2ki9vAEgWEDOw==
-----END PUBLIC KEY-----

Especificação de Armazenamento

cosign armazena assinaturas em um registro OCI e usa uma convenção de nomenclatura (tag baseada no sha256 do que estamos assinando) para localizar o índice de assinatura.

reg.example.com/ubuntu@sha256:703218c0465075f4425e58fac086e09e1de5c340b12976ab9eb8ad26615c3715 tem assinaturas localizadas em reg.example.com/ubuntu:sha256-703218c0465075f4425e58fac086e09e1de5c340b12976ab9eb8ad26615c3715.sig

Aproximadamente (ignorando portas no hostname): s/:/-/g e s/@/:/g para localizar o índice de assinatura.

Veja Condições de corrida para algumas ressalvas sobre essa estratégia.

Implementações alternativas poderiam usar logs de transparência, sistema de arquivos local, um repositório de registro separado, uma referência explícita a um índice de assinatura, uma nova API de registro, grafeas, etc.

Assuntos de assinatura

cosign atualmente só funciona para artefatos armazenados como "manifests" no registro. O mecanismo proposto é flexível o suficiente para suportar a assinatura de coisas arbitrárias.

Suporte a KMS

cosign suporta o uso de um provedor de KMS para gerar e assinar chaves. Atualmente o cosign suporta Hashicorp Vault, AWS KMS, GCP KMS, Azure Key Vault e esperamos suportar mais no futuro!

Provedores de KMS adicionais estão disponíveis como plugins externos, como OVHcloud KMS.

Consulte a documentação de KMS para mais detalhes.

Artefatos OCI

Envie um artefato para um registro usando oras (neste caso, o próprio cosign!):```shell $ oras push us-central1-docker.pkg.dev/dlorenc-vmtest2/test/artifact ./cosign Uploading f53604826795 cosign Pushed us-central1-docker.pkg.dev/dlorenc-vmtest2/test/artifact Digest: sha256:551e6cce7ed2e5c914998f931b277bc879e675b74843e6f29bc17f3b5f692bef

Agora assine! Usando `cosign`, é claro:```shell
$ cosign sign --key cosign.key us-central1-docker.pkg.dev/dlorenc-vmtest2/test/artifact@sha256:551e6cce7ed2e5c914998f931b277bc879e675b74843e6f29bc17f3b5f692bef
Enter password for private key:
Pushing signature to: us-central1-docker.pkg.dev/dlorenc-vmtest2/test/artifact:sha256-551e6cce7ed2e5c914998f931b277bc879e675b74843e6f29bc17f3b5f692bef.sig

Por fim, verifique cosign com cosign novamente:```shell $ cosign verify --key cosign.pub us-central1-docker.pkg.dev/dlorenc-vmtest2/test/artifact@sha256:551e6cce7ed2e5c914998f931b277bc879e675b74843e6f29bc17f3b5f692bef The following checks were performed on each of these signatures:

  • The cosign claims were validated
  • The claims were present in the transparency log
  • The signatures were integrated into the transparency log when the certificate was valid
  • The signatures were verified against the specified public key
  • The code-signing certificate was verified using trusted certificate authority certificates

{"Critical":{"Identity":{"docker-reference":""},"Image":{"Docker-manifest-digest":"sha256:551e6cce7ed2e5c914998f931b277bc879e675b74843e6f29bc17f3b5f692bef"},"Type":"cosign container image signature"},"Optional":null}

## FAQ

### Por que não usar o Notary v2

É difícil responder isso brevemente.
Este post contém algumas comparações:

[Notary V2 e Cosign](https://medium.com/@dlorenc/notary-v2-and-cosign-b816658f044d)

Se você encontrar outros posts de comparação, envie um PR aqui e vamos linká-los todos.

### Por que não usar a assinatura de imagens do containers/image

A assinatura de `containers/image` é próxima da do `cosign`, e reutilizamos os formatos de payload.
O `cosign` difere por assinar com chaves ECDSA-P256 em vez de PGP, e armazenar
assinaturas no registry.

### Por que não usar TUF?

Acredito que esta ferramenta é complementar ao TUF, e eles podem ser usados em conjunto.
Ainda não tentei, mas acho que também podemos reutilizar um registry para armazenamento do TUF.

## Requisitos de Design

* Sem serviços externos para armazenamento, consulta ou recuperação de assinaturas
* Buscamos o máximo de suporte a registries possível
* Tudo deve funcionar através da API do registry
* PGP não deve ser necessário de forma alguma.
* Os usuários devem conseguir encontrar todas as assinaturas de uma imagem
* Os signatários podem assinar uma imagem após o push
* Múltiplas entidades podem assinar uma imagem
* Assinar uma imagem não a modifica
* Implementação em Go puro

## Ideias Futuras

### Mudanças na API do Registry

A convenção de nomenclatura e os padrões de atualização read-modify-write que usamos para armazenar coisas em
um registry são um pouco, bem, "improvisadas".
Acho que são a melhor (única) opção real disponível hoje, mas se a API do registry
mudar, podemos melhorar isso.

### Outros Tipos

O `cosign` pode assinar qualquer coisa em um registry.
Esses exemplos mostram a assinatura de uma única imagem, mas você também pode assinar um `Index` multi-plataforma,
ou qualquer outro tipo de artefato.
Isso inclui Helm Charts, Tekton Pipelines e qualquer outra coisa que atualmente use registries OCI
para distribuição.

Isso também significa que novos tipos de artefato podem ser enviados para um registry e assinados.
Um tipo interessante de se armazenar e assinar seriam os repositórios TUF.
Ainda não tentei, mas estou bastante certo de que TUF poderia ser implementado sobre isso.

### Assinatura de Tags

As assinaturas do `cosign` protegem os digests de objetos armazenados em um registry.
O suporte opcional a `annotations` (através da flag `-a` do `cosign sign`) pode ser usado para adicionar dados
extras ao payload que é assinado e protegido pela assinatura.
Um caso de uso para isso poderia ser assinar um mapeamento tag->digest.

Se você quiser atestar que uma tag específica (ou conjunto de tags) deve apontar para um digest, você pode
executar algo como:```shell
$ docker push $IMAGE_URI
The push refers to repository [dlorenc/demo]
994393dc58e7: Pushed
5m: digest: sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870 size: 528
$ TAG=sign-me
$ cosign sign --key cosign.key -a tag=$TAG $IMAGE_URI_DIGEST
Enter password for private key:
Pushing signature to: dlorenc/demo:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870.sig

Então, você pode verificar que o mapeamento tag->digest também está incluído na assinatura, usando a opção -a do cosign verify. Este exemplo verifica que o digest $TAG que aponta para (sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870) foi assinado, e também que a anotação tag tem o valor sign-me:```shell $ cosign verify --key cosign.pub -a tag=$TAG $IMAGE_URI | jq . { "Critical": { "Identity": { "docker-reference": "" }, "Image": { "Docker-manifest-digest": "97fc222cee7991b5b061d4d4afdb5f3428fcb0c9054e1690313786befa1e4e36" }, "Type": "cosign container image signature" }, "Optional": { "tag": "sign-me" } }

Carimbos de data/hora também poderiam ser adicionados aqui, para implementar a prevenção de ataques de congelamento ao estilo TUF.

### Assinatura de Imagem Base/Camada

Novamente, o `cosign` pode assinar qualquer coisa em um registry.
Você poderia usar o `cosign` para assinar uma imagem que se destina a ser usada como imagem base,
e incluir esses metadados de proveniência nas imagens derivadas resultantes.
Isso poderia ser usado para garantir que uma imagem foi construída a partir de uma imagem base autorizada.

Ideia geral:
* Manifestos OCI possuem uma lista ordenada de `layer` `Descriptors`, que podem conter anotações.
  Veja [aqui](https://github.com/opencontainers/image-spec/blob/master/manifest.md) para a
  especificação.
* Uma imagem base é uma lista ordenada de camadas às quais outras camadas são anexadas, além de um
  objeto de configuração inicial que é mutado.
  * Uma imagem derivada é livre para excluir/destruir/recriar completamente a configuração de sua imagem base,
    portanto, assinar a configuração forneceria valor limitado.
* Podemos assinar o conjunto completo de camadas base ordenadas e anexar essa assinatura como uma anotação à
  **última** camada na imagem filha resultante.

Este manifesto de exemplo representa uma imagem que foi construída a partir de uma imagem base com duas
camadas.
Uma camada adicional é adicionada, formando a imagem final.```json
{
  "schemaVersion": 2,
  "config": {
    "mediaType": "application/vnd.oci.image.config.v1+json",
    "size": 7023,
    "digest": "sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7"
  },
  "layers": [
    {
      "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "size": 32654,
      "digest": "sha256:9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0"
    },
    {
      "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "size": 16724,
      "digest": "sha256:3c3a4604a545cdc127456d94e421cd355bca5b528f4a9c1905b15da2eb4a4c6b",
      "annotations": {
        "dev.cosign.signature.baseimage": "Ejy6ipGJjUzMDoQFePWixqPBYF0iSnIvpMWps3mlcYNSEcRRZelL7GzimKXaMjxfhy5bshNGvDT5QoUJ0tqUAg=="
      }
    },
    {
      "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "size": 73109,
      "digest": "sha256:ec4b8955958665577945c89419d1af06b5f7636b4ac3da7f12184802ad867736"
    }
  ],
}

Observe que isso pode ser aplicado recursivamente, para múltiplas imagens base intermediárias.

Contra-Assinatura

As assinaturas do Cosign (e seus payloads protegidos) são armazenadas como artefatos em um registry. Esses objetos de assinatura também podem ser assinados, resultando em um novo artefato de "contra-assinatura". Essa "contra-assinatura" protege a assinatura (ou conjunto de assinaturas) e o artefato referenciado, o que permite que ela atue como uma atestação sobre as próprias assinaturas.

Antes de assinarmos o artefato de assinatura, primeiro damos a ele um nome memorável para que possamos encontrá-lo mais tarde.```shell $ cosign sign --key cosign.key -a sig=original $IMAGE_URI_DIGEST Enter password for private key: Pushing signature to: dlorenc/demo:sha256-97fc222cee7991b5b061d4d4afdb5f3428fcb0c9054e1690313786befa1e4e36.sig $ cosign verify --key cosign.pub dlorenc/demo | jq . { "Critical": { "Identity": { "docker-reference": "" }, "Image": { "Docker-manifest-digest": "97fc222cee7991b5b061d4d4afdb5f3428fcb0c9054e1690313786befa1e4e36" }, "Type": "cosign container image signature" }, "Optional": { "sig": "original" } }

<!-- TODO: https://github.com/sigstore/cosign/issues/2333 -->

Agora dê a essa assinatura um nome memorável e assine-a:```shell
$ crane tag $(cosign triangulate $IMAGE_URI) mysignature
2021/02/15 20:22:55 dlorenc/demo:mysignature: digest: sha256:71f70e5d29bde87f988740665257c35b1c6f52dafa20fab4ba16b3b1f4c6ba0e size: 556
$ cosign sign --key cosign.key -a sig=counter dlorenc/demo:mysignature
Enter password for private key:
Pushing signature to: dlorenc/demo:sha256-71f70e5d29bde87f988740665257c35b1c6f52dafa20fab4ba16b3b1f4c6ba0e.sig
$ cosign verify --key cosign.pub dlorenc/demo:mysignature
{"Critical":{"Identity":{"docker-reference":""},"Image":{"Docker-manifest-digest":"71f70e5d29bde87f988740665257c35b1c6f52dafa20fab4ba16b3b1f4c6ba0e"},"Type":"cosign container image signature"},"Optional":{"sig":"counter"}}

Por fim, verifique a assinatura original:```shell $ crane manifest dlorenc/demo@sha256:71f70e5d29bde87f988740665257c35b1c6f52dafa20fab4ba16b3b1f4c6ba0e { "schemaVersion": 2, "config": { "mediaType": "application/vnd.oci.image.config.v1+json", "size": 233, "digest": "sha256:3b25a088710d03f39be26629d22eb68cd277a01673b9cb461c4c24fbf8c81c89" }, "layers": [ { "mediaType": "application/vnd.oci.descriptor.v1+json", "size": 217, "digest": "sha256:0e79a356609f038089088ec46fd95f4649d04de989487220b1a0adbcc63fadae", "annotations": { "dev.sigstore.cosign/signature": "5uNZKEP9rm8zxAL0VVX7McMmyArzLqtxMTNPjPO2ns+5GJpBeXg+i9ILU+WjmGAKBCqiexTxzLC1/nkOzD4cDA==" } } ] }

## Cadência de Lançamentos

Fazemos lançamentos conforme necessário. Lançamentos de correção são feitos para corrigir pequenos bugs. Lançamentos menores são feitos periodicamente quando há vários bugs corrigidos ou funcionalidades adicionadas. Lançamentos principais serão lançados quando houver funcionalidades que quebram a compatibilidade.

## Segurança

Se você descobrir quaisquer problemas de segurança, consulte o [processo de segurança](https://github.com/sigstore/.github/blob/main/SECURITY.md) do sigstore.

## Arquivos de bundle nos Assets de Lançamento do GitHub

Os assets de lançamento do GitHub para `cosign` contêm arquivos de bundle do Sigstore produzidos por [GoReleaser](https://github.com/sigstore/cosign/blob/ac999344eb381ae91455b0a9c5c267e747608d76/.goreleaser.yml#L166) ao assinar o blob do cosign que é usado para verificar a integridade dos binários de lançamento. Este arquivo não é usado pelo próprio cosign, mas é fornecido para usuários que desejam [verificar a integridade dos binários de lançamento](https://docs.sigstore.dev/cosign/system_config/installation/#verifying-cosign-with-artifact-key).

Categorias