4.4. タイムスタンプ機関の署名者鍵と証明書チェーンのローテーション
タイムスタンプ機関 (TSA) の署名者鍵と証明書チェーンをプロアクティブにローテーションできます。この手順では、古い TSA 署名者鍵と証明書チェーンを期限切れにし、Red Hat Trusted Artifact Signer (RHTAS) が使用できるように新しいものに置き換える手順を説明します。古い TSA 署名者鍵と証明書チェーンを期限切れにしても、古い鍵と証明書チェーンによって署名されたアーティファクトを検証することは可能です。
前提条件
- Red Hat OpenShift Container Platform 上で実行される RHTAS Operator をインストールする。
- Securesign インスタンスを実行する。
-
oc
およびopenssl
バイナリーがインストールされたワークステーション。
手順
OpenShift クラスターからワークステーションに
tuftool
バイナリーをダウンロードします。重要tuftool
バイナリーは Linux オペレーティングシステムでのみ使用できます。- ホームページから ? アイコンをクリックして、Command line tools をクリックし、tuftool ダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
ワークステーションでターミナルを開き、バイナリー
.gz
ファイルを展開し、実行ビットを設定します。例
$ gunzip tuftool-amd64.gz $ chmod +x tuftool-amd64
バイナリーを
$PATH
環境内の場所に移動し、名前を変更します。例
$ sudo mv tuftool-amd64 /usr/local/bin/tuftool
コマンドラインから OpenShift にログインします。
構文
oc login --token=TOKEN --server=SERVER_URL_AND_PORT
例
$ oc login --token=sha256~ZvFDBvoIYAbVECixS4-WmkN4RfnNd8Neh3y1WuiFPXC --server=https://example.com:6443
注記OpenShift Web コンソールからコマンドラインで使用するログイントークンと URL を確認できます。OpenShift Web コンソールにログインします。ユーザー名をクリックし、Copy login command をクリックします。入力を求められた場合はユーザー名とパスワードをもう一度入力し、Display Token をクリックしてコマンドを表示します。
RHTAS プロジェクトに切り替えます。
例
$ oc project trusted-artifact-signer
新しい証明書チェーンと新しい署名者鍵を生成します。
重要新しい証明書と鍵には一意のファイル名が必要です。
一時作業ディレクトリーを作成します。
例
$ mkdir certs && cd certs
ルート認証局 (CA) の秘密鍵を作成し、パスワードを設定します。
例
$ 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) を作成し、パスワードを設定します。
例
$ 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 は、新しいパスワードに置き換えます。
ルート CA を使用して中間 CA 証明書に署名します。
例
$ 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"
中間 CA 証明書に署名するには、CHANGE_ME をルート CA 秘密鍵のパスワードに置き換えます。
リーフ CA の秘密鍵と CSR を作成し、パスワードを設定します。
例
$ 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 証明書に署名します。
例
$ 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"
リーフ CA 証明書に署名するには、CHANGE_ME を中間 CA 秘密鍵のパスワードに置き換えます。
新しく作成した証明書を組み合わせて証明書チェーンを作成します。
例
$ cat leafCA.crt.pem intermediateCA.crt.pem rootCA.crt.pem > new-cert-chain.pem
署名者鍵を使用して新しいシークレットリソースを作成します。
例
$ oc create secret generic rotated-signer-key --from-file=rotated-signer-key=certs/leafCA.key.pem
新しい証明書チェーンを使用して新しいシークレットリソースを作成します。
例
$ oc create secret generic rotated-cert-chain --from-file=rotated-cert-chain=certs/new-cert-chain.pem
パスワード用の新しいシークレットリソースを作成します。
例
$ oc create secret generic rotated-password --from-literal=rotated-password=CHANGE_ME
CHANGE_ME を中間 CA 秘密鍵のパスワードに置き換えます。
アクティブな TSA 証明書ファイル名、TSA URL 文字列を見つけて、次の値を使用してシェル環境を設定します。
例
$ 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 設定を更新します。
例
$ 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 インスタンスにパッチを適用します。
例
$ oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH"
TSA サーバーが新しい署名者鍵と証明書チェーンを使用してもう一度デプロイされるのを待ちます。
例
$ oc get pods -w -l app.kubernetes.io/name=tsa-server
新しい証明書チェーンを取得します。
例
$ export NEW_CERT_CHAIN_NAME=new_tsa.certchain.pem $ curl $TSA_URL/certchain -o $NEW_CERT_CHAIN_NAME
新しい TSA 証明書チェーンを使用するように The Update Framework (TUF) サービスを設定します。
シェル環境を設定します。
例
$ 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 ディレクトリー構造を作成します。
例
$ mkdir -p "${WORK}/root/" "${KEYDIR}" "${INPUT}" "${TUF_REPO}"
TUF コンテンツを一時的な TUF ディレクトリー構造にダウンロードします。
例
$ 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 証明書を期限切れにします。
例
$ 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 証明書を追加します。
例
$ 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 サーバーにアップロードします。
例
$ oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
作業ディレクトリーを削除します。
例
$ rm -r $WORK
更新された TUF 設定で
cosign
設定を更新します。例
$ cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.json
これで、新しい TSA 署名者鍵と証明書を使用するアーティファクトに署名して検証する準備が整いました。