第 4 章 轮转证书和密钥


作为系统管理员,您可以主动轮转 Red Hat Trusted Artifact Signer (RHTAS)服务在 Red Hat OpenShift 上运行的证书和签名者密钥。定期轮转密钥可防止密钥篡改和失窃。这些步骤指导您完成旧证书和签名者密钥,并将其替换为组成 RHTAS 的底层服务的新证书和签名者密钥。您可以为以下服务轮转密钥和证书:

  • Rekor
  • 证书转换日志
  • Fulcio
  • 时间戳授权

4.1. 轮转 Rekor signer 密钥

您可以使用分片功能冻结日志树来主动轮转 Rekor 的 signer 密钥,并使用新的 signer 键创建新日志树。此流程指导您完成旧的 Rekor signer 密钥过期,并使用 Red Hat Trusted Artifact Signer (RHTAS)的新 signer 密钥替换它。使旧 Rekor signer 密钥过期仍允许您验证旧密钥签名的工件。

重要

此流程需要停机到 Rekor 服务。

先决条件

  • 安装在 Red Hat OpenShift Container Platform 上运行的 RHTAS operator。
  • 正在运行的 Securesign 实例。
  • 安装了 ocopensslcosign 二进制文件的工作站。

流程

  1. tuftool 二进制文件从 OpenShift 集群下载到您的工作站。

    重要

    tuftool 二进制文件仅适用于 Linux 操作系统。

    1. 在主页中,单击 ? 图标,单击 Command line tools,转至 tuftool 下载部分,然后点击您的平台的链接。
    2. 在工作站上的终端中,解压缩二进制 .gz 文件,并设置 execute 位:

      Example

      $ gunzip tuftool-amd64.gz
      $ chmod +x tuftool-amd64
      Copy to Clipboard Toggle word wrap

    3. 将二进制文件移到 $PATH 环境中的位置:

      Example

      $ sudo mv tuftool-amd64 /usr/local/bin/tuftool
      Copy to Clipboard Toggle word wrap

  2. 从命令行登录到 OpenShift:

    语法

    oc login --token=TOKEN --server=SERVER_URL_AND_PORT
    Copy to Clipboard Toggle word wrap

    Example

    $ oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
    Copy to Clipboard Toggle word wrap

    注意

    您可以从 OpenShift Web 控制台找到用于命令行的登录令牌和 URL。登录 OpenShift Web 控制台。单击您的用户名,然后单击 Copy login command。如果被要求,再次提供您的用户名和密码,然后单击 Display Token 以查看该命令。

  3. 切换到 RHTAS 项目:

    Example

    $ oc project trusted-artifact-signer
    Copy to Clipboard Toggle word wrap

  4. 获取 Rekor URL:

    Example

    $ export REKOR_URL=$(oc get rekor -o jsonpath='{.items[0].status.url}')
    Copy to Clipboard Toggle word wrap

  5. 获取活跃分片的日志树标识符:

    Example

    $ export OLD_TREE_ID=$(rekor-cli loginfo --rekor_server $REKOR_URL --format json | jq -r .TreeID)
    Copy to Clipboard Toggle word wrap

  6. 缩减 Rekor 实例,并将日志树设置为 DRAINING 状态:

    Example

    $ oc run --image registry.redhat.io/rhtas/updatetree-rhel9:1.1.0 --restart=Never --attach=true --rm=true -q -- updatetree --admin_server=trillian-logserver:8091 --tree_id=${OLD_TREE_ID} --tree_state=DRAINING
    Copy to Clipboard Toggle word wrap

    在排空时,树形日志不接受任何新条目。观察并等待队列为空。

    重要

    您必须等待队列为空,然后继续下一步。如果在排空时保留仍然集成,则在此过程中冻结日志树可能会导致日志路径超过最大合并延迟(MMD)。

  7. 冻结日志树:

    Example

    $ oc run --image registry.redhat.io/rhtas/updatetree-rhel9:1.1.0 --restart=Never --attach=true --rm=true -q -- updatetree --admin_server=trillian-logserver:8091 --tree_id=${OLD_TREE_ID} --tree_state=FROZEN
    Copy to Clipboard Toggle word wrap

  8. 获取 frozen 日志树的长度:

    Example

    $ export OLD_SHARD_LENGTH=$(rekor-cli loginfo --rekor_server $REKOR_URL --format json | jq -r .ActiveTreeSize)
    Copy to Clipboard Toggle word wrap

  9. 获取旧分片的 Rekor 的公钥:

    Example

    $ export OLD_PUBLIC_KEY=$(curl -s $REKOR_URL/api/v1/log/publicKey | base64 | tr -d '\n')
    Copy to Clipboard Toggle word wrap

  10. 创建新日志树:

    Example

    $ export NEW_TREE_ID=$(oc run createtree --image registry.redhat.io/rhtas/createtree-rhel9:1.1.0 --restart=Never --attach=true --rm=true -q -- -logtostderr=false --admin_server=trillian-logserver:8091 --display_name=rekor-tree)
    Copy to Clipboard Toggle word wrap

    现在,您有两个日志树、一个冻结树,以及一个将成为活跃分片的新树。

  11. 创建新私钥:

    Example

    $ openssl ecparam -genkey -name secp384r1 -noout -out new-rekor.pem
    Copy to Clipboard Toggle word wrap

    重要

    新密钥必须具有唯一的文件名。

  12. 使用新 signer 密钥创建新 secret 资源:

    Example

    $ oc create secret generic rekor-signer-key --from-file=private=new-rekor.pem
    Copy to Clipboard Toggle word wrap

  13. 使用新树标识符和旧分片信息更新 Securesign Rekor 配置:

    Example

    $ read -r -d '' SECURESIGN_PATCH_1 <<EOF
    [
        {
            "op": "replace",
            "path": "/spec/rekor/treeID",
            "value": $NEW_TREE_ID
        },
        {
            "op": "add",
            "path": "/spec/rekor/sharding/-",
            "value": {
                "treeID": $OLD_TREE_ID,
                "treeLength": $OLD_SHARD_LENGTH,
                "encodedPublicKey": "$OLD_PUBLIC_KEY"
            }
        },
        {
            "op": "replace",
            "path": "/spec/rekor/signer/keyRef",
            "value": {"name": "rekor-signer-key", "key": "private"}
        }
    ]
    EOF
    Copy to Clipboard Toggle word wrap

    注意

    如果您使用值设置了 /spec/rekor/signer/keyPasswordRef,则创建一个新的单独更新来删除它:

    Example

    $ read -r -d '' SECURESIGN_PATCH_2 <<EOF
    [
        {
            "op": "remove",
            "path": "/spec/rekor/signer/keyPasswordRef"
        }
    ]
    EOF
    Copy to Clipboard Toggle word wrap

    应用第一次更新后应用此更新。

  14. 更新 Securesign 实例:

    Example

    $ oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH_1"
    Copy to Clipboard Toggle word wrap

  15. 等待 Rekor 服务器使用新的签名者密钥重新部署:

    Example

    $ oc wait pod -l app.kubernetes.io/name=rekor-server --for=condition=Ready
    Copy to Clipboard Toggle word wrap

  16. 获取新公钥:

    Example

    $ export NEW_KEY_NAME=new-rekor.pub
    $ curl $(oc get rekor -o jsonpath='{.items[0].status.url}')/api/v1/log/publicKey -o $NEW_KEY_NAME
    Copy to Clipboard Toggle word wrap

  17. 配置更新框架(TUF)服务,以使用新的 Rekor 公钥。

    1. 设置 shell 环境:

      Example

      $ export WORK="${HOME}/trustroot-example"
      $ export ROOT="${WORK}/root/root.json"
      $ export KEYDIR="${WORK}/keys"
      $ export INPUT="${WORK}/input"
      $ export TUF_REPO="${WORK}/tuf-repo"
      $ export TUF_SERVER_POD="$(oc get pod --selector=app.kubernetes.io/component=tuf --no-headers -o custom-columns=":metadata.name")"
      Copy to Clipboard Toggle word wrap

    2. 创建临时 TUF 目录结构:

      Example

      $ mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    3. 将 TUF 内容下载到临时 TUF 目录结构中:

      Example

      $ oc extract --to "${KEYDIR}/" secret/tuf-root-keys
      $ oc cp "${TUF_SERVER_POD}:/var/www/html" "${TUF_REPO}"
      $ cp "${TUF_REPO}/root.json" "${ROOT}"
      Copy to Clipboard Toggle word wrap

    4. 查找活跃的 Rekor signer 密钥文件名。在本地 TUF 存储库中打开最新的目标文件,例如 1.target.json。在这个文件中,您将找到活跃的 Rekor signer 密钥文件名,例如 rekor.pub。使用这个活跃 Rekor signer 密钥文件名设置环境变量:

      Example

      $ export ACTIVE_KEY_NAME=rekor.pub
      Copy to Clipboard Toggle word wrap

    5. 使用旧公钥更新 Rekor signer 密钥:

      Example

      $ echo $OLD_PUBLIC_KEY | base64 -d > $ACTIVE_KEY_NAME
      Copy to Clipboard Toggle word wrap

    6. 使旧的 Rekor signer 密钥过期:

      Example

      $ tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-rekor-target "${ACTIVE_KEY_NAME}" \
        --rekor-uri "https://rekor.rhtas" \
        --rekor-status "Expired" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    7. 添加新的 Rekor signer 密钥:

      Example

      $ tuftool rhtas \
        --root "${ROOT}" \
        --key "${KEYDIR}/snapshot.pem" \
        --key "${KEYDIR}/targets.pem" \
        --key "${KEYDIR}/timestamp.pem" \
        --set-rekor-target "${NEW_KEY_NAME}" \
        --rekor-uri "https://rekor.rhtas" \
        --outdir "${TUF_REPO}" \
        --metadata-url "file://${TUF_REPO}"
      Copy to Clipboard Toggle word wrap

    8. 将这些更改上传到 TUF 服务器:

      Example

      $ oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
      Copy to Clipboard Toggle word wrap

    9. 删除工作目录:

      Example

      $ rm -r $WORK
      Copy to Clipboard Toggle word wrap

  18. 使用更新的 TUF 配置更新 cosign 配置:

    Example

    $ cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
    Copy to Clipboard Toggle word wrap

    现在,您已使用新的 Rekor signer 密钥签名并验证您的工件。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat