1.3. 証明書と鍵のローテーション
システム管理者は、Red Hat OpenShift 上で実行されている Red Hat Trusted Artifact Signer (RHTAS) サービスで使用される証明書と署名者鍵をプロアクティブにローテーションできます。定期的に鍵をローテーションすることで、鍵の改ざんや盗難を防ぐことができます。これらの手順では、古い証明書と署名者鍵を期限切れにし、RHTAS を設定する基盤となるサービス用の新しい証明書と署名者鍵に置き換える手順を説明します。次のサービスの鍵と証明書をローテーションできます。
- Rekor
- Certificate Transparency ログ
- Fulcio
- タイムスタンプ機関
1.3.1. Rekor 署名者鍵のローテーション リンクのコピーリンクがクリップボードにコピーされました!
シャーディング機能を使用してログツリーをフリーズし、新しい署名者鍵を使用して新しいログツリーを作成することで、Rekor の署名者鍵を積極的にローテーションできます。この手順では、古い Rekor 署名者鍵を期限切れにし、Red Hat Trusted Artifact Signer (RHTAS) が使用する新しい署名者鍵に置き換える手順を説明します。古い Rekor 署名者鍵の有効期限が切れても、古い鍵で署名されたアーティファクトを検証することは可能です。
この手順では、Rekor サービスを停止する必要があります。
前提条件
- Red Hat OpenShift Container Platform 上で実行される RHTAS Operator をインストールする。
- Securesign インスタンスを実行する。
-
oc、openssl、cosignバイナリーがインストールされたワークステーション。
手順
OpenShift クラスターからワークステーションに
rekor-cliバイナリーをダウンロードします。- OpenShift Web コンソールにログインします。ホームページで ? アイコンをクリックし、Command line tools をクリックして rekor-cli ダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
ワークステーションでターミナルを開き、バイナリー
.gzファイルを展開し、実行ビットを設定します。例
gunzip rekor-cli-amd64.gz chmod +x rekor-cli-amd64バイナリーを
$PATH環境内の場所に移動し、名前を変更します。例
sudo mv rekor-cli-amd64 /usr/local/bin/rekor-cli
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-signerRekor URL を取得します。
例
export REKOR_URL=$(oc get rekor -o jsonpath='{.items[0].status.url}')アクティブシャードのログツリー識別子を取得します。
例
export OLD_TREE_ID=$(rekor-cli loginfo --rekor_server $REKOR_URL --format json | jq -r .TreeID)ログツリーを
DRAINING状態に設定します。例
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ツリーログは、drain の実行中に新しいエントリーを受け入れません。キューが空になるまで待ちます。
重要次のステップに進む前に、キューが空になるまで待つ必要があります。drain の実行中にリーフがまだ統合中の場合、このプロセス中にログツリーをフリーズすると、ログパスが最大マージ遅延 (MMD) しきい値を超える可能性があります。
ログツリーをフリーズします。
例
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フリーズしたログツリーの長さを取得します。
例
export OLD_SHARD_LENGTH=$(rekor-cli loginfo --rekor_server $REKOR_URL --format json | jq -r .ActiveTreeSize)古いシャードの Rekor の公開鍵を取得します。
例
export OLD_PUBLIC_KEY=$(curl -s $REKOR_URL/api/v1/log/publicKey | base64 | tr -d '\n')新しいログツリーを作成します。
例
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)これで、ログツリーが 2 つ、フリーズしたツリーが 1 つ、およびアクティブなシャードになる新しいツリーが 1 つできました。
新しい秘密鍵を作成します。
例
openssl ecparam -genkey -name secp384r1 -noout -out new-rekor.pem重要新しい鍵には一意のファイル名が必要です。
新しい署名者鍵を使用して新しいシークレットリソースを作成します。
例
oc create secret generic rekor-signer-key --from-file=private=new-rekor.pem新しいツリー識別子と古いシャーディング情報を使用して、Securesign Rekor 設定を更新します。
例
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に値が設定されている場合は、それを削除する新しい個別の更新を作成します。例
read -r -d '' SECURESIGN_PATCH_2 <<EOF [ { "op": "remove", "path": "/spec/rekor/signer/keyPasswordRef" } ] EOF最初の更新を適用した後、この更新を適用します。
Securesign インスタンスを更新します。
例
oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH_1"Rekor サーバーが新しい署名者鍵で再デプロイされるのを待ちます。
例
oc wait pod -l app.kubernetes.io/name=rekor-server --for=condition=Ready新しい公開鍵を取得します。
例
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新しい Rekor 公開鍵を使用するように 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}"アクティブな Rekor 署名者鍵ファイル名を見つけます。ローカル TUF リポジトリー内の最新のターゲットファイル (例:
1.target.json) を開きます。このファイルには、アクティブな Rekor 署名者鍵ファイル名 (例:rekor.pub) が記載されています。次のアクティブな Rekor 署名者鍵ファイル名で環境変数を設定します。例
export ACTIVE_KEY_NAME=rekor.pub古い公開鍵を使用して Rekor 署名者鍵を更新します。
例
echo $OLD_PUBLIC_KEY | base64 -d > $ACTIVE_KEY_NAME古い Rekor 署名者鍵を期限切れにします。
例
tuftool rhtas \ --root "${ROOT}" \ --key "${KEYDIR}/snapshot.pem" \ --key "${KEYDIR}/targets.pem" \ --key "${KEYDIR}/timestamp.pem" \ --set-rekor-target "${ACTIVE_KEY_NAME}" \ --rekor-uri "${REKOR_URL}" \ --rekor-status "Expired" \ --outdir "${TUF_REPO}" \ --metadata-url "file://${TUF_REPO}"新しい Rekor 署名者鍵を追加します。
例
tuftool rhtas \ --root "${ROOT}" \ --key "${KEYDIR}/snapshot.pem" \ --key "${KEYDIR}/targets.pem" \ --key "${KEYDIR}/timestamp.pem" \ --set-rekor-target "${NEW_KEY_NAME}" \ --rekor-uri "${REKOR_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これで、新しい Rekor 署名者鍵を使用してアーティファクトに署名し、検証する準備が整いました。
1.3.2. Certificate Transparency ログ署名者アギのローテーション リンクのコピーリンクがクリップボードにコピーされました!
シャーディング機能を使用してログツリーをフリーズし、新しい署名者鍵を使用して新しいログツリーを作成することにより、Certificate Transparency (CT) ログ署名者鍵をプロアクティブにローテーションできます。この手順では、古い CT ログ署名者鍵を期限切れにし、Red Hat Trusted Artifact Signer (RHTAS) が使用する新しい署名者鍵に置き換える手順を説明します。古い CT ログ署名者鍵の有効期限が切れても、古い鍵で署名されたアーティファクトを検証することは可能です。
前提条件
- Red Hat OpenShift Container Platform 上で実行される RHTAS Operator をインストールする。
- Securesign インスタンスを実行する。
-
oc、openssl、cosignバイナリーがインストールされたワークステーション。
手順
OpenShift クラスターからワークステーションに
tuftoolバイナリーをダウンロードします。重要現在、
tuftoolバイナリーは、x86_64 アーキテクチャー上の 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現在の CT ログ設定と鍵のバックアップを作成します。
例
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現在のツリー識別子を取得します。
例
export OLD_TREE_ID=$(oc get ctlog -o jsonpath='{.items[0].status.treeID}')ログツリーを
DRAINING状態に設定します。例
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ツリーログは、drain の実行中に新しいエントリーを受け入れません。キューが空になるまで待ちます。
重要次のステップに進む前に、キューが空になるまで待つ必要があります。drain の実行中にリーフがまだ統合中の場合、このプロセス中にログツリーをフリーズすると、ログパスが最大マージ遅延 (MMD) しきい値を超える可能性があります。
キューが完全に空になったら、ログをフリーズします。
例
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 ツリーを作成し、新しいツリー識別子を取得します。
例
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)新しい証明書と新しい公開鍵および秘密鍵を生成します。
例
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ファイルを開いて編集します。 ログをフリーズした場合、フリーズされたログエントリーに
not_after_limitフィールドを追加し、接頭辞値を一意の名前に変更し、秘密鍵への古いパスをctfe-keys/private-0に置き換えます。例
... 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フィールドは、フリーズされたログだけのタイムスタンプ範囲の終了を定義します。この時点以降の証明書は、このログに含めることができなくなります。-
凍結されたログ
configブロックをコピーして貼り付け、設定ファイルに追加して新しいエントリーを作成します。 新しい
configブロック内の次の行を変更します。log_idを新しいツリー識別子に設定し、prefixをtrusted-artifact-signer、private_keyパスをctfe-keys/privateに変更します。public_key行は削除し、not_after_limitはnot_after_startに変更して、タイムスタンプの範囲を設定します。例
... 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フィールドは、タイムスタンプ範囲の開始 (開始地点を含む) を定義します。これは、この時点でログが証明書の受け入れを開始することを意味します。
-
新しいシークレットリソースを作成します。
例
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_MECHANGE_ME は、新しい秘密鍵のパスワードに置き換えます。
新しい CT ログ公開鍵を使用するように 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}"アクティブな CT ログの公開鍵ファイル名を見つけます。ローカル TUF リポジトリー内の最新のターゲットファイル (例:
1.targets.json) を開きます。このターゲットファイルには、アクティブな CT ログ公開鍵ファイル名 (例:ctfe.pub) が含まれます。次のアクティブな CT ログ公開鍵ファイル名で環境変数を設定します。例
export ACTIVE_CTFE_NAME=ctfe.pubOpenShift からアクティブな CT ログ公開鍵を抽出します。
例
oc get secret $(oc get ctlog securesign-sample -o jsonpath='{.status.publicKeyRef.name}') -o jsonpath='{.data.public}' | base64 -d > $ACTIVE_CTFE_NAME古い CT ログ署名者鍵を期限切れにします。
例
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 ログ署名者鍵を追加します。
例
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 サーバーにアップロードします。
例
oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"
新しいツリー識別子を使用して Securesign CT ログ設定を更新します。
例
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"} } ] EOFSecuresign インスタンスにパッチを適用します。
例
oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH"CT ログサーバーが再びデプロイされるまで待ちます。
例
oc wait pod -l app.kubernetes.io/name=ctlog --for=condition=Ready作業ディレクトリーを削除します。
例
rm -r $WORK更新された TUF 設定で
cosign設定を更新します。例
cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.jsonこれで、新しい CT ログ署名者鍵を使用してアーティファクトに署名し、検証する準備が整いました。
1.3.3. Fulcio 証明書のローテーション リンクのコピーリンクがクリップボードにコピーされました!
Fulcio サービスで使用される証明書をプロアクティブにローテーションできます。この手順では、古い Fulcio 証明書の有効期限を切れさせ、Red Hat Trusted Artifact Signer (RHTAS) が使用できるように新しい証明書に置き換える手順を説明します。古い Fulcio 証明書の有効期限が切れても、古い証明書で署名されたアーティファクトを検証することは可能です。
前提条件
- Red Hat OpenShift Container Platform 上で実行される RHTAS Operator をインストールする。
- Securesign インスタンスを実行する。
-
oc、openssl、cosignバイナリーがインストールされたワークステーション。
手順
OpenShift クラスターからワークステーションに
tuftoolバイナリーをダウンロードします。重要現在、
tuftoolバイナリーは、x86_64 アーキテクチャー上の 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新しい証明書と新しい公開鍵および秘密鍵を生成します。
例
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.pemCHANGE_ME は、新しいパスワードに置き換えます。
重要証明書と新しい鍵には一意のファイル名が必要です。
新規シークレットを作成します。
例
oc create secret generic fulcio-config \ --from-file=private=new-fulcio.pass.pem \ --from-file=cert=new-fulcio.cert.pem \ --from-literal=password=CHANGE_MECHANGE_ME は、新しいパスワードに置き換えます。
注記ここでのパスワードは、新しい秘密鍵と公開鍵を生成するために使用したパスワードと同じものに指定する必要があります。
新しい Fulcio 証明書を使用するように 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}"アクティブな Fulcio 証明書ファイル名を見つけます。ローカル TUF リポジトリー内の最新のターゲットファイル (例:
1.targets.json) を開きます。このファイルには、アクティブな Fulcio 証明書ファイル名 (例:fulcio_v1.crt.pem) が記載されています。このアクティブな Fulcio 証明書ファイル名で環境変数を設定します。例
export ACTIVE_CERT_NAME=fulcio_v1.crt.pemOpenShift からアクティブな Fulcio 証明書を抽出します。
例
oc get secret $(oc get fulcio securesign-sample -o jsonpath='{.status.certificate.caRef.name}') -o jsonpath='{.data.cert}' | base64 -d > $ACTIVE_CERT_NAME古い証明書を期限切れにします。
例
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 証明書を追加します。
例
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 サーバーにアップロードします。
例
oc rsync "${TUF_REPO}/" "${TUF_SERVER_POD}:/var/www/html"作業ディレクトリーを削除します。
例
rm -r $WORK
Securesign Fulcio 設定を更新します。
例
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"}] } ] EOFSecuresign インスタンスにパッチを適用します。
例
oc patch Securesign securesign-sample --type='json' -p="$SECURESIGN_PATCH"Fulcio サーバーが再デプロイされるまで待ちます。
例
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設定を更新します。例
cosign initialize --mirror=$TUF_URL --root=$TUF_URL/root.jsonこれで、新しい Fulcio 証明書を使用してアーティファクトに署名し、検証する準備が整いました。
1.3.4. タイムスタンプ機関の署名者鍵と証明書チェーンのローテーション リンクのコピーリンクがクリップボードにコピーされました!
タイムスタンプ機関 (TSA) の署名者鍵と証明書チェーンをプロアクティブにローテーションできます。この手順では、古い TSA 署名者鍵と証明書チェーンを期限切れにし、Red Hat Trusted Artifact Signer (RHTAS) が使用できるように新しいものに置き換える手順を説明します。古い TSA 署名者鍵と証明書チェーンを期限切れにしても、古い鍵と証明書チェーンによって署名されたアーティファクトを検証することは可能です。
前提条件
- Red Hat OpenShift Container Platform 上で実行される RHTAS Operator をインストールする。
- Securesign インスタンスを実行する。
-
ocおよびopensslバイナリーがインストールされたワークステーション。
手順
OpenShift クラスターからワークステーションに
tuftoolバイナリーをダウンロードします。重要現在、
tuftoolバイナリーは、x86_64 アーキテクチャー上の 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 -e "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 -e "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-tsa.certchain.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-tsa.certchain.pemパスワード用の新しいシークレットリソースを作成します。
例
oc create secret generic rotated-password --from-literal=rotated-password=CHANGE_MECHANGE_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_NAMESecuresign 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"} } } ] EOFSecuresign インスタンスにパッチを適用します。
例
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 署名者鍵と証明書を使用するアーティファクトに署名して検証する準備が整いました。