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
$ gunzip tuftool-amd64.gz $ chmod +x tuftool-amd64
将二进制文件移到
$PATH
环境中的位置:Example
$ sudo mv tuftool-amd64 /usr/local/bin/tuftool
从命令行登录到 OpenShift:
语法
oc 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 以查看该命令。
切换到 RHTAS 项目:
Example
$ oc project trusted-artifact-signer
生成新证书链和新的签名者密钥。
重要新证书和密钥必须具有唯一的文件名。
创建临时工作目录:
Example
$ mkdir certs && cd certs
创建 root 证书颁发机构(CA)私钥并设置密码:
Example
$ 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
$ 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
$ 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
$ 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
$ 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
$ cat leafCA.crt.pem intermediateCA.crt.pem rootCA.crt.pem > new-cert-chain.pem
使用 signer 密钥创建新 secret 资源:
Example
$ oc create secret generic rotated-signer-key --from-file=rotated-signer-key=certs/leafCA.key.pem
使用新证书链创建新 secret 资源:
Example
$ oc create secret generic rotated-cert-chain --from-file=rotated-cert-chain=certs/new-cert-chain.pem
使用密码创建新 secret 资源:
Example
$ oc create secret generic rotated-password --from-literal=rotated-password=CHANGE_ME
将 CHANGE_ME 替换为中间 CA 私钥密码。
查找您的活跃 TSA 证书文件名 TSA URL 字符串,并使用这些值配置 shell 环境:
Example
$ 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
$ 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
$ oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH"
等待 TSA 服务器使用新的签名者密钥和证书链重新部署:
Example
$ oc get pods -w -l app.kubernetes.io/name=tsa-server
获取新证书链:
Example
$ export NEW_CERT_CHAIN_NAME=new_tsa.certchain.pem $ curl $TSA_URL/certchain -o $NEW_CERT_CHAIN_NAME
配置更新框架(TUF)服务,以使用新的 TSA 证书链。
设置 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")"
创建临时 TUF 目录结构:
Example
$ mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
将 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}"
使旧的 TSA 证书过期:
Example
$ 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
$ 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
$ oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
删除工作目录:
Example
$ rm -r $WORK
使用更新的 TUF 配置更新
cosign
配置:Example
$ cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
现在,您已准备好签名并验证使用新的 TSA 签名器密钥和证书的工件。