管理指南
Trusted Artifact Signer 服务的常规管理
摘要
前言
欢迎使用 Red Hat Trusted Artifact Signer 管理指南!
本指南可帮助您为 Red Hat OpenShift 上运行的 Trusted Artifact Signer (RHTAS)服务使用常规的维护例程。您可以在 部署指南 中找到有关部署 Trusted Artifact Signer 服务的信息。
第 1 章 保护您的签名数据
作为系统管理员,当因为硬件故障或意外删除数据而丢失时,保护软件供应链的签名数据至关重要。OpenShift API 数据保护(OADP)产品为在 Red Hat OpenShift 上运行的应用程序提供数据保护。通过使用 OADP 产品,这有助于我们使软件开发人员尽快签名和验证代码。安装和配置 OADP operator 后,您可以开始备份和恢复 Red Hat Trusted Artifact Signer (RHTAS)数据。
1.1. 安装和配置 OADP operator
OpenShift API Data Protection (OADP)操作器可让您备份 OpenShift 应用程序资源和内部容器镜像。您可以使用 OADP operator 来备份和恢复 Trusted Artifact Signer 数据。
此流程使用 Amazon Web Services (AWS) Simple Storage Service (S3)创建一个存储桶,以说明如何配置 OADP operator。您可以选择使用不同的 S3 兼容对象存储平台,而不是 AWS,如 Red Hat OpenShift Data Foundation。
先决条件
- Red Hat OpenShift Container Platform 版本 4.13 或更高版本。
-
使用
cluster-admin
角色访问 OpenShift Web 控制台。 - 创建 S3 兼容存储桶的功能。
-
安装了
oc
和aws
二进制文件的工作站。
流程
在工作站上打开一个终端,并登录到 OpenShift:
语法
Copy to clipboardCopiedoc login --token=TOKEN --server=SERVER_URL_AND_PORT
Example
$ oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
注意您可以从 OpenShift Web 控制台找到用于命令行的登录令牌和 URL。登录 OpenShift Web 控制台。单击您的用户名,然后单击 Copy login command。如果被要求,再次提供您的用户名和密码,然后单击 Display Token 以查看该命令。
创建新存储桶:
语法
Copy to clipboardCopiedexport BUCKET=NEW_BUCKET_NAME export REGION=AWS_REGION_ID export USER=OADP_USER_NAME aws s3api create-bucket \ --bucket $BUCKET \ --region $REGION \ --create-bucket-configuration LocationConstraint=$REGION
Example
Copy to clipboardCopied$ export BUCKET=example-bucket-name $ export REGION=us-east-1 $ export USER=velero $ $ aws s3api create-bucket \ --bucket $BUCKET \ --region $REGION \ --create-bucket-configuration LocationConstraint=$REGION
创建一个新用户:
Example
Copy to clipboardCopied$ aws iam create-user --user-name $USER
创建新策略:
Example
Copy to clipboardCopied$ cat > velero-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeVolumes", "ec2:DescribeSnapshots", "ec2:CreateTags", "ec2:CreateVolume", "ec2:CreateSnapshot", "ec2:DeleteSnapshot" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:DeleteObject", "s3:PutObject", "s3:AbortMultipartUpload", "s3:ListMultipartUploadParts" ], "Resource": [ "arn:aws:s3:::${BUCKET}/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation", "s3:ListBucketMultipartUploads" ], "Resource": [ "arn:aws:s3:::${BUCKET}" ] } ] } EOF
将这个策略与新用户关联:
Example
Copy to clipboardCopied$ aws iam put-user-policy \ --user-name $USER \ --policy-name velero \ --policy-document file://velero-policy.json
创建访问密钥:
Example
Copy to clipboardCopied$ aws iam create-access-key --user-name $USER --output=json | jq -r '.AccessKey | [ "export AWS_ACCESS_KEY_ID=" + .AccessKeyId, "export AWS_SECRET_ACCESS_KEY=" + .SecretAccessKey ] | join("\n")'
使用 AWS secret 密钥信息创建凭证文件:
语法
Copy to clipboardCopiedcat << EOF > ./credentials-velero [default] aws_access_key_id=$AWS_ACCESS_KEY_ID aws_secret_access_key=$AWS_SECRET_ACCESS_KEY EOF
-
使用具有
cluster-admin
角色的用户登录 OpenShift Web 控制台。 - 从 Administrator 视角中,展开 Operators 导航菜单,然后点 OperatorHub。
- 在搜索字段中,键入 oadp,然后点红帽提供的 OADP Operator 标题。
- 单击 Install 按钮,以显示 Operator 详情。
- 接受默认值,点 Install Operator 页面中的 Install,并等待安装完成。
在 Operator 安装完成后,从 workstation 终端为您的 AWS 凭证创建一个 secret 资源:
Example
Copy to clipboardCopied$ oc create secret generic cloud-credentials -n openshift-adp --from-file cloud=credentials-velero
- 在 OpenShift Web 控制台中点 View Operator 按钮。
- 在 DataProtectionApplication (DPA) 标题上点 Create instance。
- 在 Create DataProtectionApplication 页面中,选择 YAML 视图。
编辑资源文件中的以下值:
-
在
metadata
部分下,将velero-sample
替换为velero
。 -
在
spec.configuration.nodeAgent
部分下,将restic
替换为kopia
。 -
在
spec.configuration.velero
部分下,添加resourceTimeout: 10m
。 -
在
spec.configuration.velero.defaultPlugins
部分下,add- csi
。 -
在
spec.snapshotLocations
部分下,将us-west-2
值替换为 AWS 区域值。 -
在
spec.backupLocations
部分下,将us-east-1
值替换为 AWS 区域值。 -
在
spec.backupLocations.objectStorage
部分下,将my-bucket-name
替换为您的存储桶名称。如果您使用不同的前缀,将velero
替换为您的存储桶前缀名称。
-
在
- 点 Create 按钮。
其他资源
1.2. 备份您的 Trusted Artifact Signer 数据
安装 OpenShift API Data Protection (OADP)操作器并部署了实例后,您可以创建一个卷快照资源,以及一个备份资源来备份 Red Hat Trusted Artifact Signer 数据。
先决条件
- Red Hat OpenShift Container Platform 版本 4.13 或更高版本。
-
使用
cluster-admin
角色访问 OpenShift Web 控制台。 - 安装 OADP operator。
-
安装了
oc
二进制文件的工作站。
流程
在工作站上打开一个终端,并登录到 OpenShift:
语法
Copy to clipboardCopiedoc login --token=TOKEN --server=SERVER_URL_AND_PORT
Example
Copy to clipboardCopied$ oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
注意您可以从 OpenShift Web 控制台找到用于命令行的登录令牌和 URL。登录 OpenShift Web 控制台。单击您的用户名,然后单击 Copy login command。如果被要求,再次提供您的用户名和密码,然后单击 Display Token 以查看该命令。
查找并编辑
VolumeSnapshotClass
资源:Example
Copy to clipboardCopied$ oc get VolumeSnapshotClass -n openshift-adp $ oc edit VolumeSnapshotClass csi-aws-vsc -n openshift-adp
更新资源文件中的以下值:
-
在
metadata.labels
部分下,添加velero.io/csi-volumesnapshot-class: "true"
标签。 - 保存更改,再退出编辑器。
-
在
创建
Backup
资源:Example
Copy to clipboardCopied$ cat <<EOF | oc apply -f - apiVersion: velero.io/v1 kind: Backup metadata: name: rhtas-backup labels: velero.io/storage-location: velero-1 namespace: openshift-adp spec: schedule: 0 7 * * * hooks: {} includedNamespaces: - trusted-artifact-signer includedResources: [] excludedResources: [] snapshotMoveData: true storageLocation: velero-1 ttl: 720h0m0s EOF
添加 schedule 属性,以启用 Cron 调度来运行此备份。在示例中,此备份资源每天在 7:00 上午 7:00 运行。
默认情况下,所有资源都会在 trusted-artifact-signer 命名空间中备份。您可以分别使用 includeResources 或 excludeResources 属性来指定您要包含或排除的资源。
重要根据备份目标的存储类,持久性卷无法主动用于备份。
1.3. 恢复您的受信任的工件签名程序数据
安装了 Red Hat Trusted Artifact Signer (RHTAS)和 OpenShift API Data Protection (OADP)运算符,以及 RHTAS 命名空间的备份资源,您可以将您的数据恢复到 OpenShift 集群。
先决条件
- Red Hat OpenShift Container Platform 版本 4.13 或更高版本。
-
使用
cluster-admin
角色访问 OpenShift Web 控制台。 - 安装 RHTAS 运算符.
- 安装 OADP operator。
-
trusted-artifact-signer
命名空间结构的备份资源。 -
安装了
oc
二进制文件的工作站。
流程
禁用 RHTAS 操作器:
Example
Copy to clipboardCopied$ oc scale deploy rhtas-operator-controller-manager --replicas=0 -n openshift-operators
创建
Restore
资源:Example
Copy to clipboardCopied$ cat <<EOF | oc apply -f - apiVersion: velero.io/v1 kind: Restore metadata: name: rhtas-restore namespace: openshift-adp spec: backupName: rhtas-backup includedResources: [] restoreStatus: includedResources: - securesign.rhtas.redhat.com - trillian.rhtas.redhat.com - ctlog.rhtas.redhat.com - fulcio.rhtas.redhat.com - rekor.rhtas.redhat.com - tuf.rhtas.redhat.com - timestampauthority.rhtas.redhat.com excludedResources: - pod - deployment - nodes - route - service - replicaset - events - cronjob - events.events.k8s.io - backups.velero.io - restores.velero.io - resticrepositories.velero.io - pods - deployments restorePVs: true existingResourcePolicy: update EOF
启用 RHTAS 操作器:
Example
Copy to clipboardCopied$ oc scale deploy rhtas-operator-controller-manager --replicas=1 -n openshift-operators
第 2 章 更新框架的可信工件签名实施
从 Red Hat Trusted Artifact Signer (RHTAS)版本 1.1 开始,我们实施了更新框架(TUF)作为信任 root 来存储公钥,以及 RHTAS 服务使用的证书。更新框架是一种复杂的框架,用于保护软件更新系统,这使其成为保护所提供的工件的理想选择。更新框架将 RHTAS 服务称为可信根目标。每个 RHTAS 服务有四个可信目标:Fulcio、Certificate Transparency (CT)日志、Rekor 和 Timestamp Authority (TSA)。客户端软件(如 cosign
)使用 RHTAS 信任 root 目标来签名和验证工件签名。简单的 HTTP 服务器将公钥和证书分发到客户端软件。这个简单的 HTTP 服务器具有单个目标的 TUF 存储库。
在 OpenShift 中部署 RHTAS 操作器时,我们默认创建一个 TUF 存储库,并预填充各个目标。默认情况下,从部署 Securesign 实例的时间,所有元数据文件的过期日期为 52 周。红帽建议选择较短的过期周期,并经常轮转您的公钥和证书。定期进行这些维护任务有助于防止对代码库的攻击。
第 3 章 更新更新框架元数据文件
默认情况下,更新框架(TUF)元数据文件会在 Securesign 实例的部署日期起 52 周后过期。您至少必须每 52 周更新一次 TUF 元数据文件,然后再过期。红帽建议更新元数据文件,超过一年一次。
此流程指导您刷新根和非 root 元数据文件。
先决条件
- 安装在 Red Hat OpenShift Container Platform 上运行的 RHTAS operator。
- 正在运行的 Securesign 实例。
-
安装了
oc
二进制文件的工作站。
流程
将
tuftool
二进制文件从 OpenShift 集群下载到您的工作站。重要tuftool
二进制文件仅适用于 Linux 操作系统。- 在主页中,单击 ? 图标,单击 Command line tools,转至 tuftool 下载部分,然后点击您的平台的链接。
在工作站上打开一个终端,解压缩二进制
.gz
文件,并设置 execute 位:Example
Copy to clipboardCopied$ gunzip tuftool-amd64.gz $ chmod +x tuftool-amd64
将二进制文件移到
$PATH
环境中的位置:Example
Copy to clipboardCopied$ sudo mv tuftool-amd64 /usr/local/bin/tuftool
从命令行登录到 OpenShift:
语法
Copy to clipboardCopiedoc login --token=TOKEN --server=SERVER_URL_AND_PORT
Example
Copy to clipboardCopied$ oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
注意您可以从 OpenShift Web 控制台找到用于命令行的登录令牌和 URL。登录 OpenShift Web 控制台。单击您的用户名,然后单击 Copy login command。如果被要求,再次提供您的用户名和密码,然后单击 Display Token 以查看该命令。
切换到 RHTAS 项目:
Example
Copy to clipboardCopied$ oc project trusted-artifact-signer
配置 shell 环境:
Example
Copy to clipboardCopied$ 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")" $ export TIMESTAMP_EXPIRATION="in 10 days" $ export SNAPSHOT_EXPIRATION="in 26 weeks" $ export TARGETS_EXPIRATION="in 26 weeks" $ export ROOT_EXPIRATION="in 26 weeks"
根据您的要求设置过期持续时间。
创建临时 TUF 目录结构:
Example
Copy to clipboardCopied$ mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
将 TUF 内容下载到临时 TUF 目录结构中:
Example
Copy to clipboardCopied$ oc extract --to "${KEYDIR}/" secret/tuf-root-keys $ oc cp "${TUF_SERVER_POD}:/var/www/html" "${TUF_REPO}" $ cp "${TUF_REPO}/root.json" "${ROOT}"
您可以在一个命令中更新时间戳、快照和目标元数据:
Example
Copy to clipboardCopied$ tuftool update \ --root "${ROOT}" \ --key "${KEYDIR}/timestamp.pem" \ --key "${KEYDIR}/snapshot.pem" \ --key "${KEYDIR}/targets.pem" \ --timestamp-expires "${TIMESTAMP_EXPIRATION}" \ --snapshot-expires "${SNAPSHOT_EXPIRATION}" \ --targets-expires "${TARGETS_EXPIRATION}" \ --outdir "${TUF_REPO}" \ --metadata-url "file://${TUF_REPO}"
注意您还可以在 TUF 元数据文件的子集上运行 TUF 元数据更新。例如,
timestamp.json
元数据文件会超过其他元数据文件的频率。因此,您只能运行以下命令来更新时间戳元数据文件:
Copy to clipboardCopied$ tuftool update \ --root "${ROOT}" \ --key "${KEYDIR}/timestamp.pem" \ --timestamp-expires "${TIMESTAMP_EXPIRATION}" \ --outdir "${TUF_REPO}" \ --metadata-url "file://${TUF_REPO}"
只有在要过期时才更新 root 过期日期:
Example
Copy to clipboardCopied$ tuftool root expire "${ROOT}" "${ROOT_EXPIRATION}"
注意如果 root 文件没有接近过期,您可以跳过这一步。
更新根版本:
Example
Copy to clipboardCopied$ tuftool root bump-version "${ROOT}"
再次为 root 元数据文件签名:
Example
Copy to clipboardCopied$ tuftool root sign "${ROOT}" -k "${KEYDIR}/root.pem"
设置新的 root 版本,并复制 root 元数据文件:
Example
Copy to clipboardCopied$ export NEW_ROOT_VERSION=$(cat "${ROOT}" | jq -r ".signed.version") $ cp "${ROOT}" "${TUF_REPO}/root.json" $ cp "${ROOT}" "${TUF_REPO}/${NEW_ROOT_VERSION}.root.json"
将这些更改上传到 TUF 服务器:
Example
Copy to clipboardCopied$ oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
第 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 实例。
-
安装了
oc
、openssl
和cosign
二进制文件的工作站。
流程
将
tuftool
二进制文件从 OpenShift 集群下载到您的工作站。重要tuftool
二进制文件仅适用于 Linux 操作系统。- 在主页中,单击 ? 图标,单击 Command line tools,转至 tuftool 下载部分,然后点击您的平台的链接。
在工作站上的终端中,解压缩二进制
.gz
文件,并设置 execute 位:Example
Copy to clipboardCopied$ gunzip tuftool-amd64.gz $ chmod +x tuftool-amd64
将二进制文件移到
$PATH
环境中的位置:Example
Copy to clipboardCopied$ sudo mv tuftool-amd64 /usr/local/bin/tuftool
从命令行登录到 OpenShift:
语法
Copy to clipboardCopiedoc login --token=TOKEN --server=SERVER_URL_AND_PORT
Example
Copy to clipboardCopied$ oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
注意您可以从 OpenShift Web 控制台找到用于命令行的登录令牌和 URL。登录 OpenShift Web 控制台。单击您的用户名,然后单击 Copy login command。如果被要求,再次提供您的用户名和密码,然后单击 Display Token 以查看该命令。
切换到 RHTAS 项目:
Example
Copy to clipboardCopied$ oc project trusted-artifact-signer
获取 Rekor URL:
Example
Copy to clipboardCopied$ export REKOR_URL=$(oc get rekor -o jsonpath='{.items[0].status.url}')
获取活跃分片的日志树标识符:
Example
Copy to clipboardCopied$ export OLD_TREE_ID=$(rekor-cli loginfo --rekor_server $REKOR_URL --format json | jq -r .TreeID)
缩减 Rekor 实例,并将日志树设置为
DRAINING
状态:Example
Copy to clipboardCopied$ 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
在排空时,树形日志不接受任何新条目。观察并等待队列为空。
重要您必须等待队列为空,然后继续下一步。如果在排空时保留仍然集成,则在此过程中冻结日志树可能会导致日志路径超过最大合并延迟(MMD)。
冻结日志树:
Example
Copy to clipboardCopied$ 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
获取 frozen 日志树的长度:
Example
Copy to clipboardCopied$ export OLD_SHARD_LENGTH=$(rekor-cli loginfo --rekor_server $REKOR_URL --format json | jq -r .ActiveTreeSize)
获取旧分片的 Rekor 的公钥:
Example
Copy to clipboardCopied$ export OLD_PUBLIC_KEY=$(curl -s $REKOR_URL/api/v1/log/publicKey | base64 | tr -d '\n')
创建新日志树:
Example
Copy to clipboardCopied$ 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)
现在,您有两个日志树、一个冻结树,以及一个将成为活跃分片的新树。
创建新私钥:
Example
Copy to clipboardCopied$ openssl ecparam -genkey -name secp384r1 -noout -out new-rekor.pem
重要新密钥必须具有唯一的文件名。
使用新 signer 密钥创建新 secret 资源:
Example
Copy to clipboardCopied$ oc create secret generic rekor-signer-key --from-file=private=new-rekor.pem
使用新树标识符和旧分片信息更新 Securesign Rekor 配置:
Example
Copy to clipboardCopied$ 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
注意如果您使用值设置了
/spec/rekor/signer/keyPasswordRef
,则创建一个新的单独更新来删除它:Example
Copy to clipboardCopied$ read -r -d '' SECURESIGN_PATCH_2 <<EOF [ { "op": "remove", "path": "/spec/rekor/signer/keyPasswordRef" } ] EOF
应用第一次更新后应用此更新。
更新 Securesign 实例:
Example
Copy to clipboardCopied$ oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH_1"
等待 Rekor 服务器使用新的签名者密钥重新部署:
Example
Copy to clipboardCopied$ oc wait pod -l app.kubernetes.io/name=rekor-server --for=condition=Ready
获取新公钥:
Example
Copy to clipboardCopied$ 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
配置更新框架(TUF)服务,以使用新的 Rekor 公钥。
设置 shell 环境:
Example
Copy to clipboardCopied$ 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")"
创建临时 TUF 目录结构:
Example
Copy to clipboardCopied$ mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
将 TUF 内容下载到临时 TUF 目录结构中:
Example
Copy to clipboardCopied$ oc extract --to "${KEYDIR}/" secret/tuf-root-keys $ oc cp "${TUF_SERVER_POD}:/var/www/html" "${TUF_REPO}" $ cp "${TUF_REPO}/root.json" "${ROOT}"
查找活跃的 Rekor signer 密钥文件名。在本地 TUF 存储库中打开最新的目标文件,例如
1.target.json
。在这个文件中,您将找到活跃的 Rekor signer 密钥文件名,例如rekor.pub
。使用这个活跃 Rekor signer 密钥文件名设置环境变量:Example
Copy to clipboardCopied$ export ACTIVE_KEY_NAME=rekor.pub
使用旧公钥更新 Rekor signer 密钥:
Example
Copy to clipboardCopied$ echo $OLD_PUBLIC_KEY | base64 -d > $ACTIVE_KEY_NAME
使旧的 Rekor signer 密钥过期:
Example
Copy to clipboardCopied$ 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}"
添加新的 Rekor signer 密钥:
Example
Copy to clipboardCopied$ 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}"
将这些更改上传到 TUF 服务器:
Example
Copy to clipboardCopied$ oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
删除工作目录:
Example
Copy to clipboardCopied$ rm -r $WORK
使用更新的 TUF 配置更新
cosign
配置:Example
Copy to clipboardCopied$ cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
现在,您已使用新的 Rekor signer 密钥签名并验证您的工件。
4.2. 轮转证书转换日志签名者密钥
您可以使用分片功能冻结日志树,主动轮转证书转换(CT)日志签名程序密钥,并使用新的签名程序密钥创建新日志树。此流程指导您完成旧的 CT 日志签名程序密钥,并使用 Red Hat Trusted Artifact Signer (RHTAS)的新 signer 密钥替换它。使旧的 CT 日志签名器密钥过期仍允许您验证旧密钥签名的工件。
先决条件
- 安装在 Red Hat OpenShift Container Platform 上运行的 RHTAS operator。
- 正在运行的 Securesign 实例。
-
安装了
oc
、openssl
和cosign
二进制文件的工作站。
流程
将
tuftool
二进制文件从 OpenShift 集群下载到您的工作站。重要tuftool
二进制文件仅适用于 Linux 操作系统。- 在主页中,单击 ? 图标,单击 Command line tools,转至 tuftool 下载部分,然后点击您的平台的链接。
在工作站上打开一个终端,解压缩二进制
.gz
文件,并设置 execute 位:Example
Copy to clipboardCopied$ gunzip tuftool-amd64.gz $ chmod +x tuftool-amd64
将二进制文件移到
$PATH
环境中的位置:Example
Copy to clipboardCopied$ sudo mv tuftool-amd64 /usr/local/bin/tuftool
从命令行登录到 OpenShift:
语法
Copy to clipboardCopiedoc login --token=TOKEN --server=SERVER_URL_AND_PORT
Example
Copy to clipboardCopied$ oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
注意您可以从 OpenShift Web 控制台找到用于命令行的登录令牌和 URL。登录 OpenShift Web 控制台。单击您的用户名,然后单击 Copy login command。如果被要求,再次提供您的用户名和密码,然后单击 Display Token 以查看该命令。
切换到 RHTAS 项目:
Example
Copy to clipboardCopied$ oc project trusted-artifact-signer
备份当前的 CT 日志配置和密钥:
Example
Copy to clipboardCopied$ export SERVER_CONFIG_NAME=$(oc get ctlog -o jsonpath='{.items[0].status.serverConfigRef.name}') $ oc get secret $SERVER_CONFIG_NAME -o jsonpath="{.data.config}" | base64 --decode > config.txtpb $ oc get secret $SERVER_CONFIG_NAME -o jsonpath="{.data.fulcio-0}" | base64 --decode > fulcio-0.pem $ oc get secret $SERVER_CONFIG_NAME -o jsonpath="{.data.private}" | base64 --decode > private.pem $ oc get secret $SERVER_CONFIG_NAME -o jsonpath="{.data.public}" | base64 --decode > public.pem
捕获当前树标识符:
Example
Copy to clipboardCopied$ export OLD_TREE_ID=$(oc get ctlog -o jsonpath='{.items[0].status.treeID}')
将日志树设置为
DRAINING
状态:Example
Copy to clipboardCopied$ 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
在排空时,树形日志不接受任何新条目。观察并等待队列为空。
重要您必须等待队列为空,然后继续下一步。如果在排空时保留仍然集成,则在此过程中冻结日志树可能会导致日志路径超过最大合并延迟(MMD)。
队列完全排空后,冻结日志:
Example
Copy to clipboardCopied$ 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
创建新的 Merkle 树,并捕获新的树标识符:
Example
Copy to clipboardCopied$ export NEW_TREE_ID=$(kubectl 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=ctlog-tree)
生成新证书,以及新的公钥和私钥:
Example
Copy to clipboardCopied$ openssl ecparam -genkey -name prime256v1 -noout -out new-ctlog.pem $ openssl ec -in new-ctlog.pem -pubout -out new-ctlog-public.pem $ openssl ec -in new-ctlog.pem -out new-ctlog.pass.pem -des3 -passout pass:"CHANGE_ME"
将 CHANGE_ME 替换为新密码。
重要证书和密钥必须具有唯一的文件名。
更新 CT 日志配置。
-
打开
config.txtpb
文件进行编辑。 对于 frozen 日志,将
not_after_limit
字段添加到 frozen 日志条目中,将前缀值重命名为唯一名称,并使用ctfe-keys/private-0
替换到私钥的旧路径:Example
... log_configs:{ # frozen log config:{ log_id:2066075212146181968 prefix:"trusted-artifact-signer-0" roots_pem_file:"/ctfe-keys/fulcio-0" private_key:{[type.googleapis.com/keyspb.PEMKeyFile]:{path:"/ctfe-keys/private-0" password:"Example123"}} public_key:{der:"0Y0\x13\x06\x07*\x86H\xce=\x02\x01\x06\x08*\x86H\xce=\x03\x01\x07\x03B\x00\x04)'.\xffUJ\xe2s)\xefR\x8a\xfcO\xdcewȶy\xa7\x9d<\x13\xb0\x1c\x99\x96\xe4'\xe3v\x07:\xc8I+\x08J\x9d\x8a\xed\x06\xe4\xaeI:q\x98\xf4\xbc<o4VD\x0cr\xf9\x9c\xecxT\x84"} not_after_limit:{seconds:1728056285 nanos:012111000} ext_key_usages:"CodeSigning" log_backend_name:"trillian" }
注意您可以运行以下命令来获取秒和纳秒的当前时间值:
date +%s
,以及date +%N
。重要not_after_limit
字段仅定义 frozen 日志的时间戳范围的末尾。除此刻外的证书不再接受在此日志中包括的证书。-
复制并粘贴 frozen 日志
配置
块,将其附加到配置文件中以创建新条目。 更改新
config
块中的以下行:将log_id
设置为新的树标识符,将前缀
改为trusted-artifact-signer
,将private_key
路径更改为ctfe-keys/private
,删除public_key
行,并将not_after_limit
更改为not_after_start
并设置时间戳范围:Example
... log_configs:{ # frozen log ... # new active log config:{ log_id: NEW_TREE_ID prefix:"trusted-artifact-signer" roots_pem_file:"/ctfe-keys/fulcio-0" private_key:{[type.googleapis.com/keyspb.PEMKeyFile]:{path:"ctfe-keys/private" password:"CHANGE_ME"}} ext_key_usages:"CodeSigning" not_after_start:{seconds:1713201754 nanos:155663000} log_backend_name:"trillian" }
添加 NEW_TREE_ID,并将 CHANGE_ME 替换为新私钥密码。此处的密码必须与用于生成新私钥和公钥的密码匹配。
重要not_after_start
字段定义时间戳范围的开头。这意味着日志此时将开始接受证书。
-
打开
创建新 secret 资源:
Example
Copy to clipboardCopied$ oc create secret generic ctlog-config \ --from-file=config=config.txtpb \ --from-file=private=new-ctlog.pass.pem \ --from-file=public=new-ctlog-public.pem \ --from-file=fulcio-0=fulcio-0.pem \ --from-file=private-0=private.pem \ --from-file=public-0=public.pem \ --from-literal=password=CHANGE_ME
使用新私钥密码替换 CHANGE_ME。
配置更新框架(TUF)服务,以使用新的 CT 日志公钥。
设置 shell 环境:
Example
Copy to clipboardCopied$ 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")"
创建临时 TUF 目录结构:
Example
Copy to clipboardCopied$ mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
将 TUF 内容下载到临时 TUF 目录结构中:
Example
Copy to clipboardCopied$ oc extract --to "${KEYDIR}/" secret/tuf-root-keys $ oc cp "${TUF_SERVER_POD}:/var/www/html" "${TUF_REPO}" $ cp "${TUF_REPO}/root.json" "${ROOT}"
查找活跃的 CT 日志公钥文件名。在本地 TUF 存储库中打开最新的目标文件,例如
1.targets.json
。在此目标文件中,您将找到活跃的 CT 日志公钥文件名,例如ctfe.pub
。使用这个活跃 CT 日志公钥文件名设置环境变量:Example
Copy to clipboardCopied$ export ACTIVE_CTFE_NAME=ctfe.pub
从 OpenShift 中提取活跃的 CT 日志公钥:
Example
Copy to clipboardCopied$ oc get secret $(oc get ctlog securesign-sample -o jsonpath='{.status.publicKeyRef.name}') -o jsonpath='{.data.public}' | base64 -d > $ACTIVE_CTFE_NAME
使旧的 CT 日志签名者密钥过期:
Example
Copy to clipboardCopied$ tuftool rhtas \ --root "${ROOT}" \ --key "${KEYDIR}/snapshot.pem" \ --key "${KEYDIR}/targets.pem" \ --key "${KEYDIR}/timestamp.pem" \ --set-ctlog-target "$ACTIVE_CTFE_NAME" \ --ctlog-uri "https://ctlog.rhtas" \ --ctlog-status "Expired" \ --outdir "${TUF_REPO}" \ --metadata-url "file://${TUF_REPO}"
添加新的 CT 日志签名器密钥:
Example
Copy to clipboardCopied$ tuftool rhtas \ --root "${ROOT}" \ --key "${KEYDIR}/snapshot.pem" \ --key "${KEYDIR}/targets.pem" \ --key "${KEYDIR}/timestamp.pem" \ --set-ctlog-target "new-ctlog-public.pem" \ --ctlog-uri "https://ctlog.rhtas" \ --outdir "${TUF_REPO}" \ --metadata-url "file://${TUF_REPO}"
将这些更改上传到 TUF 服务器:
Example
Copy to clipboardCopied$ oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
删除工作目录:
Example
Copy to clipboardCopied$ rm -r $WORK
使用新树标识符更新 Securesign CT 日志配置:
Example
Copy to clipboardCopied$ read -r -d '' SECURESIGN_PATCH <<EOF [ { "op": "replace", "path": "/spec/ctlog/serverConfigRef", "value": {"name": "ctlog-config"} }, { "op": "replace", "path": "/spec/ctlog/treeID", "value": $NEW_TREE_ID }, { "op": "replace", "path": "/spec/ctlog/privateKeyRef", "value": {"name": "ctlog-config", "key": "private"} }, { "op": "replace", "path": "/spec/ctlog/privateKeyPasswordRef", "value": {"name": "ctlog-config", "key": "password"} }, { "op": "replace", "path": "/spec/ctlog/publicKeyRef", "value": {"name": "ctlog-config", "key": "public"} } ] EOF
对 Securesign 实例进行补丁:
Example
Copy to clipboardCopied$ oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH"
等待 CT 日志服务器重新部署:
Example
Copy to clipboardCopied$ oc wait pod -l app.kubernetes.io/name=ctlog --for=condition=Ready
使用更新的 TUF 配置更新
cosign
配置:Example
Copy to clipboardCopied$ cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
现在,您已准备好使用新的 CT 日志签名器密钥签名并验证您的工件。
4.3. 轮转 Fulcio 证书
您可以主动轮转 Fulcio 服务使用的证书。此流程指导您完成旧的 Fulcio 证书,并使用要使用的 Red Hat Trusted Artifact Signer (RHTAS)的新证书替换它。使旧的 Fulcio 证书过期仍允许您验证旧证书签名的工件。
先决条件
- 安装在 Red Hat OpenShift Container Platform 上运行的 RHTAS operator。
- 正在运行的 Securesign 实例。
-
安装了
oc
、openssl
和cosign
二进制文件的工作站。
流程
将
tuftool
二进制文件从 OpenShift 集群下载到您的工作站。重要tuftool
二进制文件仅适用于 Linux 操作系统。- 在主页中,单击 ? 图标,单击 Command line tools,转至 tuftool 下载部分,然后点击您的平台的链接。
在工作站上打开一个终端,解压缩二进制
.gz
文件,并设置 execute 位:Example
Copy to clipboardCopied$ gunzip tuftool-amd64.gz $ chmod +x tuftool-amd64
将二进制文件移到
$PATH
环境中的位置:Example
Copy to clipboardCopied$ sudo mv tuftool-amd64 /usr/local/bin/tuftool
从命令行登录到 OpenShift:
语法
Copy to clipboardCopiedoc login --token=TOKEN --server=SERVER_URL_AND_PORT
Example
Copy to clipboardCopied$ oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
注意您可以从 OpenShift Web 控制台找到用于命令行的登录令牌和 URL。登录 OpenShift Web 控制台。单击您的用户名,然后单击 Copy login command。如果被要求,再次提供您的用户名和密码,然后单击 Display Token 以查看该命令。
切换到 RHTAS 项目:
Example
Copy to clipboardCopied$ oc project trusted-artifact-signer
生成新证书,以及新的公钥和私钥:
Example
Copy to clipboardCopied$ openssl ecparam -genkey -name prime256v1 -noout -out new-fulcio.pem $ openssl ec -in new-fulcio.pem -pubout -out new-fulcio-public.pem $ openssl ec -in new-fulcio.pem -out new-fulcio.pass.pem -des3 -passout pass:"CHANGE_ME" $ openssl req -new -x509 -key new-fulcio.pass.pem -out new-fulcio.cert.pem
将 CHANGE_ME 替换为新密码。
重要证书和密钥必须具有唯一的文件名。
创建新 secret:
Example
Copy to clipboardCopied$ oc create secret generic fulcio-config \ --from-file=private=new-fulcio.pass.pem \ --from-file=cert=new-fulcio.cert.pem \ --from-literal=password=CHANGE_ME
将 CHANGE_ME 替换为新密码。
注意此处的密码必须与用于生成新私钥和公钥的密码匹配。
配置更新框架(TUF)服务以使用新的 Fulcio 证书。
设置 shell 环境:
Example
Copy to clipboardCopied$ 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")"
创建临时 TUF 目录结构:
Example
Copy to clipboardCopied$ mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
将 TUF 内容下载到临时 TUF 目录结构中:
Example
Copy to clipboardCopied$ oc extract --to "${KEYDIR}/" secret/tuf-root-keys $ oc cp "${TUF_SERVER_POD}:/var/www/html" "${TUF_REPO}" $ cp "${TUF_REPO}/root.json" "${ROOT}"
查找活跃的 Fulcio 证书文件名。在本地 TUF 存储库中打开最新的目标文件,例如
1.targets.json
。在这个文件中,您将找到活跃的 Fulcio 证书文件名,例如fulcio_v1.crt.pem
。使用这个活跃 Fulcio 证书文件名设置环境变量:Example
Copy to clipboardCopied$ export ACTIVE_CERT_NAME=fulcio_v1.crt.pem
从 OpenShift 中提取活跃的 Fulico 证书:
Example
Copy to clipboardCopied$ oc get secret $(oc get fulcio securesign-sample -o jsonpath='{.status.certificate.caRef.name}') -o jsonpath='{.data.cert}' | base64 -d > $ACTIVE_CERT_NAME
使旧证书过期:
Example
Copy to clipboardCopied$ tuftool rhtas \ --root "${ROOT}" \ --key "${KEYDIR}/snapshot.pem" \ --key "${KEYDIR}/targets.pem" \ --key "${KEYDIR}/timestamp.pem" \ --set-fulcio-target "$ACTIVE_CERT_NAME" \ --fulcio-uri "https://fulcio.rhtas" \ --fulcio-status "Expired" \ --outdir "${TUF_REPO}" \ --metadata-url "file://${TUF_REPO}"
添加新的 Fulcio 证书:
Example
Copy to clipboardCopied$ tuftool rhtas \ --root "${ROOT}" \ --key "${KEYDIR}/snapshot.pem" \ --key "${KEYDIR}/targets.pem" \ --key "${KEYDIR}/timestamp.pem" \ --set-fulcio-target "new-fulcio.cert.pem" \ --fulcio-uri "https://fulcio.rhtas" \ --outdir "${TUF_REPO}" \ --metadata-url "file://${TUF_REPO}"
将这些更改上传到 TUF 服务器:
Example
Copy to clipboardCopied$ oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
删除工作目录:
Example
Copy to clipboardCopied$ rm -r $WORK
更新 Securesign Fulcio 配置:
Example
Copy to clipboardCopied$ read -r -d '' SECURESIGN_PATCH <<EOF [ { "op": "replace", "path": "/spec/fulcio/certificate/privateKeyRef", "value": {"name": "fulcio-config", "key": "private"} }, { "op": "replace", "path": "/spec/fulcio/certificate/privateKeyPasswordRef", "value": {"name": "fulcio-config", "key": "password"} }, { "op": "replace", "path": "/spec/fulcio/certificate/caRef", "value": {"name": "fulcio-config", "key": "cert"} }, { "op": "replace", "path": "/spec/ctlog/rootCertificates", "value": [{"name": "fulcio-config", "key": "cert"}] } ] EOF
对 Securesign 实例进行补丁:
Example
Copy to clipboardCopied$ oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH"
等待 Fulcio 服务器重新部署:
Example
Copy to clipboardCopied$ oc wait pod -l app.kubernetes.io/name=fulcio-server --for=condition=Ready $ oc wait pod -l app.kubernetes.io/name=ctlog --for=condition=Ready
使用更新的 TUF 配置更新
cosign
配置:Example
Copy to clipboardCopied$ cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
现在,您已准备好使用新的 Fulcio 证书签名并验证您的工件。
4.4. 轮转 Timestamp Authority 签名者密钥和证书链
您可以主动轮转 Timestamp Authority (TSA)签名者密钥和证书链。此流程指导您完成旧的 TSA 签名者密钥和证书链,并使用要使用的 Red Hat Trusted Artifact Signer (RHTAS)替换它们。使旧 TSA 签名者密钥和证书链过期仍允许您验证旧密钥和证书链签名的工件。
先决条件
- 安装在 Red Hat OpenShift Container Platform 上运行的 RHTAS operator。
- 正在运行的 Securesign 实例。
-
安装了
oc
和openssl
二进制文件的工作站。
流程
将
tuftool
二进制文件从 OpenShift 集群下载到您的工作站。重要tuftool
二进制文件仅适用于 Linux 操作系统。- 在主页中,单击 ? 图标,单击 Command line tools,转至 tuftool 下载部分,然后点击您的平台的链接。
在工作站上打开一个终端,解压缩二进制
.gz
文件,并设置 execute 位:Example
Copy to clipboardCopied$ gunzip tuftool-amd64.gz $ chmod +x tuftool-amd64
将二进制文件移到
$PATH
环境中的位置:Example
Copy to clipboardCopied$ sudo mv tuftool-amd64 /usr/local/bin/tuftool
从命令行登录到 OpenShift:
语法
Copy to clipboardCopiedoc login --token=TOKEN --server=SERVER_URL_AND_PORT
Example
Copy to clipboardCopied$ oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
注意您可以从 OpenShift Web 控制台找到用于命令行的登录令牌和 URL。登录 OpenShift Web 控制台。单击您的用户名,然后单击 Copy login command。如果被要求,再次提供您的用户名和密码,然后单击 Display Token 以查看该命令。
切换到 RHTAS 项目:
Example
Copy to clipboardCopied$ oc project trusted-artifact-signer
生成新证书链和新的签名者密钥。
重要新证书和密钥必须具有唯一的文件名。
创建临时工作目录:
Example
Copy to clipboardCopied$ mkdir certs && cd certs
创建 root 证书颁发机构(CA)私钥并设置密码:
Example
Copy to clipboardCopied$ openssl req -x509 -newkey rsa:2048 -days 365 -sha256 -nodes \ -keyout rootCA.key.pem -out rootCA.crt.pem \ -passout pass:"CHANGE_ME" \ -subj "/C=CC/ST=state/L=Locality/O=RH/OU=RootCA/CN=RootCA" \ -addext "basicConstraints=CA:true" -addext "keyUsage=cRLSign, keyCertSign"
将 CHANGE_ME 替换为新密码。
创建中间 CA 私钥和证书签名请求(CSR),并设置密码:
Example
Copy to clipboardCopied$ openssl req -newkey rsa:2048 -sha256 \ -keyout intermediateCA.key.pem -out intermediateCA.csr.pem \ -passout pass:"CHANGE_ME" \ -subj "/C=CC/ST=state/L=Locality/O=RH/OU=IntermediateCA/CN=IntermediateCA"
将 CHANGE_ME 替换为新密码。
使用 root CA 签署中间 CA 证书:
Example
Copy to clipboardCopied$ openssl x509 -req -in intermediateCA.csr.pem -CA rootCA.crt.pem -CAkey rootCA.key.pem \ -CAcreateserial -out intermediateCA.crt.pem -days 365 -sha256 \ -extfile <(echo "basicConstraints=CA:true\nkeyUsage=cRLSign, keyCertSign\nextendedKeyUsage=critical,timeStamping") \ -passin pass:"CHANGE_ME"
使用 root CA 私钥密码替换 CHANGE_ME,以签署中间 CA 证书。
创建叶 CA 私钥和 CSR,并设置密码:
Example
Copy to clipboardCopied$ openssl req -newkey rsa:2048 -sha256 \ -keyout leafCA.key.pem -out leafCA.csr.pem \ -passout pass:"CHANGE_ME" \ -subj "/C=CC/ST=state/L=Locality/O=RH/OU=LeafCA/CN=LeafCA"
使用中间 CA 签署叶 CA 证书:
Example
Copy to clipboardCopied$ openssl x509 -req -in leafCA.csr.pem -CA intermediateCA.crt.pem -CAkey intermediateCA.key.pem \ -CAcreateserial -out leafCA.crt.pem -days 365 -sha256 \ -extfile <(echo "basicConstraints=CA:false\nkeyUsage=cRLSign, keyCertSign\nextendedKeyUsage=critical,timeStamping") \ -passin pass:"CHANGE_ME"
将 CHANGE_ME 替换为中间 CA 私钥密码,以签署叶 CA 证书。
通过组合新创建的证书来创建证书链:
Example
Copy to clipboardCopied$ cat leafCA.crt.pem intermediateCA.crt.pem rootCA.crt.pem > new-cert-chain.pem
使用 signer 密钥创建新 secret 资源:
Example
Copy to clipboardCopied$ oc create secret generic rotated-signer-key --from-file=rotated-signer-key=certs/leafCA.key.pem
使用新证书链创建新 secret 资源:
Example
Copy to clipboardCopied$ oc create secret generic rotated-cert-chain --from-file=rotated-cert-chain=certs/new-cert-chain.pem
使用密码创建新 secret 资源:
Example
Copy to clipboardCopied$ oc create secret generic rotated-password --from-literal=rotated-password=CHANGE_ME
将 CHANGE_ME 替换为中间 CA 私钥密码。
查找您的活跃 TSA 证书文件名 TSA URL 字符串,并使用这些值配置 shell 环境:
Example
Copy to clipboardCopied$ export ACTIVE_CERT_CHAIN_NAME=tsa.certchain.pem $ export TSA_URL=$(oc get timestampauthority securesign-sample -o jsonpath='{.status.url}')/api/v1/timestamp $ curl $TSA_URL/certchain -o $ACTIVE_CERT_CHAIN_NAME
更新 Securesign TSA 配置:
Example
Copy to clipboardCopied$ read -r -d '' SECURESIGN_PATCH <<EOF [ { "op": "replace", "path": "/spec/tsa/signer/certificateChain", "value": { "certificateChainRef" : {"name": "rotated-cert-chain", "key": "rotated-cert-chain"} } }, { "op": "replace", "path": "/spec/tsa/signer/file", "value": { "privateKeyRef": {"name": "rotated-signer-key", "key": "rotated-signer-key"}, "passwordRef": {"name": "rotated-password", "key": "rotated-password"} } } ] EOF
对 Securesign 实例进行补丁:
Example
Copy to clipboardCopied$ oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH"
等待 TSA 服务器使用新的签名者密钥和证书链重新部署:
Example
Copy to clipboardCopied$ oc get pods -w -l app.kubernetes.io/name=tsa-server
获取新证书链:
Example
Copy to clipboardCopied$ export NEW_CERT_CHAIN_NAME=new_tsa.certchain.pem $ curl $TSA_URL/certchain -o $NEW_CERT_CHAIN_NAME
配置更新框架(TUF)服务,以使用新的 TSA 证书链。
设置 shell 环境:
Example
Copy to clipboardCopied$ 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")"
创建临时 TUF 目录结构:
Example
Copy to clipboardCopied$ mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
将 TUF 内容下载到临时 TUF 目录结构中:
Example
Copy to clipboardCopied$ oc extract --to "${KEYDIR}/" secret/tuf-root-keys $ oc cp "${TUF_SERVER_POD}:/var/www/html" "${TUF_REPO}" $ cp "${TUF_REPO}/root.json" "${ROOT}"
使旧的 TSA 证书过期:
Example
Copy to clipboardCopied$ tuftool rhtas \ --root "${ROOT}" \ --key "${KEYDIR}/snapshot.pem" \ --key "${KEYDIR}/targets.pem" \ --key "${KEYDIR}/timestamp.pem" \ --set-tsa-target "$ACTIVE_CERT_CHAIN_NAME" \ --tsa-uri "$TSA_URL" \ --tsa-status "Expired" \ --outdir "${TUF_REPO}" \ --metadata-url "file://${TUF_REPO}"
添加新的 TSA 证书:
Example
Copy to clipboardCopied$ tuftool rhtas \ --root "${ROOT}" \ --key "${KEYDIR}/snapshot.pem" \ --key "${KEYDIR}/targets.pem" \ --key "${KEYDIR}/timestamp.pem" \ --set-tsa-target "$NEW_CERT_CHAIN_NAME" \ --tsa-uri "$TSA_URL" \ --outdir "${TUF_REPO}" \ --metadata-url "file://${TUF_REPO}"
将这些更改上传到 TUF 服务器:
Example
Copy to clipboardCopied$ oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
删除工作目录:
Example
Copy to clipboardCopied$ rm -r $WORK
使用更新的 TUF 配置更新
cosign
配置:Example
Copy to clipboardCopied$ cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
现在,您已准备好签名并验证使用新的 TSA 签名器密钥和证书的工件。
第 5 章 使用您自己的证书颁发机构捆绑包
您可以让机构的证书颁发机构(CA)捆绑包与红帽的受信任的 Artifact Signer (RHTAS)服务签名和验证构建工件。
先决条件
- 安装在 Red Hat OpenShift Container Platform 上运行的 RHTAS operator。
- 正在运行的 Securesign 实例。
- 您的 CA 根证书。
-
安装了
oc
二进制文件的工作站。
流程
从命令行登录到 OpenShift:
语法
Copy to clipboardCopiedoc login --token=TOKEN --server=SERVER_URL_AND_PORT
Example
Copy to clipboardCopied$ oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
注意您可以从 OpenShift Web 控制台找到用于命令行的登录令牌和 URL。登录 OpenShift Web 控制台。单击您的用户名,然后单击 Copy login command。如果被要求,再次提供您的用户名和密码,然后单击 Display Token 以查看该命令。
切换到 RHTAS 项目:
Example
Copy to clipboardCopied$ oc project trusted-artifact-signer
使用机构的 CA root 证书捆绑包创建新 ConfigMap:
Example
Copy to clipboardCopied$ oc create configmap custom-ca-bundle --from-file=ca-bundle.crt
重要证书文件名必须是
ca-bundle.crt
。打开 Securesign 资源进行编辑:
Example
Copy to clipboardCopied$ oc edit Securesign securesign-sample
在
metadata.annotations
部分下添加rhtas.redhat.com/trusted-ca
:Example
Copy to clipboardCopiedapiVersion: rhtas.redhat.com/v1alpha1 kind: Securesign metadata: name: example-instance annotations: rhtas.redhat.com/trusted-ca: custom-ca-bundle spec: ...
- 保存并退出编辑器。
打开 Fulcio 资源进行编辑:
Example
Copy to clipboardCopied$ oc edit Fulcio securesign-sample
在
metadata.annotations
部分下添加rhtas.redhat.com/trusted-ca
:Example
Copy to clipboardCopiedapiVersion: rhtas.redhat.com/v1alpha1 kind: Fulcio metadata: name: example-instance annotations: rhtas.redhat.com/trusted-ca: custom-ca-bundle spec: ...
- 保存并退出编辑器。
- 在签名和验证工件前,等待 RHTAS 操作器重新配置。