1.3. 在 Tekton Chains 中签名数据的 secret

集群管理员可以生成密钥对,并使用 Tekton 链来使用 Kubernetes secret 为工件签名。要使 Tekton 链正常工作,加密的密钥和密码必须存在,作为 openshift-pipelines 命名空间中的 signing-secrets secret 的一部分。

目前,Tekton 链支持 x509cosign 签名方案。

注意

只使用一个受支持的签名方案。

要将 x509 签名方案与 Tekton Chains 搭配使用,请将 ed25519ecdsa 类型的 x509.pem 私钥存储在 signing-secrets Kubernetes secret 中。

1.3.1. 使用 cosign 进行签名

您可以使用 cosign 工具使用带有 Tekton 链的 cosign 签名方案。

先决条件

流程

  1. 运行以下命令,生成 cosign.keycosign.pub 密钥对:

    $ cosign generate-key-pair k8s://openshift-pipelines/signing-secrets

    Cosign 会提示您输入密码,然后创建一个 Kubernetes secret。

  2. 将加密的 cosign.key 私钥和 cosign.password 解密密码存储在 signing-secrets Kubernetes secret 中。确保私钥存储为 ENCRYPTED COSIGN PRIVATE KEY 类型的加密 PEM 文件。

1.3.2. 使用 skopeo 进行签名

您可以使用 skopeo 工具生成密钥,并在带有 Tekton 链的 cosign 签名方案中使用它们。

先决条件

流程

  1. 运行以下命令生成公钥/私钥对:

    $ skopeo generate-sigstore-key --output-prefix <mykey> 1
    1
    <mykey> 替换为您选择的密钥名称。

    Skopeo 会提示您输入私钥的密码短语,然后创建名为 <mykey>.private<mykey>.pub 的密钥文件。

  2. 运行以下命令,使用 base64 工具对 <mykey>.pub 文件进行编码:

    $ base64 -w 0 <mykey>.pub > b64.pub
  3. 运行以下命令,使用 base64 工具对 <mykey>.private 文件进行编码:

    $ base64 -w 0 <mykey>.private > b64.private
  4. 运行以下命令,使用 base64 工具对 passhprase 进行编码:

    $ echo -n '<passphrase>' | base64 -w 0 > b64.passphrase 1
    1
    <passphrase> 替换为用于密钥对的密码短语。
  5. 运行以下命令,在 openshift-pipelines 命名空间中创建 signing-secrets secret:

    $ oc create secret generic signing-secrets -n openshift-pipelines
  6. 运行以下命令来编辑 signing-secrets secret:

    $ oc edit secret -n openshift-pipelines signing-secrets

    使用以下方法在 secret 的数据中添加编码的密钥:

    apiVersion: v1
    data:
      cosign.key: <Encoded <mykey>.private> 1
      cosign.password: <Encoded passphrase> 2
      cosign.pub: <Encoded <mykey>.pub> 3
    immutable: true
    kind: Secret
    metadata:
      name: signing-secrets
    # ...
    type: Opaque
    1
    <Encoded <mykey>.private> 替换为 b64.private 文件的内容。
    2
    <Encoded passphrase> 替换为 b64.passphrase 文件的内容。
    3
    <Encoded <mykey>.pub> 替换为 b64.pub 文件的内容。

1.3.3. 解决 "secret already exists" 错误

如果 signing-secret secret 已经填充,则创建此 secret 的命令可能会输出以下出错信息:

Error from server (AlreadyExists): secrets "signing-secrets" already exists

您可以通过删除 secret 来解决这个问题。

流程

  1. 运行以下命令来删除 signing-secret secret:

    $ oc delete secret signing-secrets -n openshift-pipelines
  2. 重新创建密钥对,并使用您首选的签名方案将其存储在机密中。