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 インスタンスを実行する。
  • ocopensslcosign バイナリーがインストールされたワークステーション。

手順

  1. OpenShift クラスターからワークステーションに rekor-cli バイナリーをダウンロードします。

    1. OpenShift Web コンソールにログインします。ホームページで ? アイコンをクリックし、Command line tools をクリックして rekor-cli ダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルを開き、バイナリー .gz ファイルを展開し、実行ビットを設定します。

      gunzip rekor-cli-amd64.gz
      chmod +x rekor-cli-amd64
      Copy to Clipboard Toggle word wrap

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      sudo mv rekor-cli-amd64 /usr/local/bin/rekor-cli
      Copy to Clipboard Toggle word wrap

  2. OpenShift クラスターからワークステーションに tuftool バイナリーをダウンロードします。

    重要

    tuftool バイナリーは Linux オペレーティングシステムでのみ使用できます。

    1. ホームページから ? アイコンをクリックして、Command line tools をクリックし、tuftool ダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルから、バイナリー .gz ファイルを展開し、実行ビットを設定します。

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

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

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

  3. コマンドラインから OpenShift にログインします。

    構文

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

    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 をクリックしてコマンドを表示します。

  4. RHTAS プロジェクトに切り替えます。

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

  5. Rekor URL を取得します。

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

  6. アクティブシャードのログツリー識別子を取得します。

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

  7. ログツリーを 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
    Copy to Clipboard Toggle word wrap

    ツリーログは、ドレイン中に新しいエントリーを受け入れません。キューが空になるまで待ちます。

    重要

    次のステップに進む前に、キューが空になるまで待つ必要があります。ドレイン中にリーフがまだ統合中の場合、このプロセス中にログツリーをフリーズすると、ログパスが最大マージ遅延 (MMD) しきい値を超える可能性があります。

  8. ログツリーをフリーズします。

    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

  9. フリーズしたログツリーの長さを取得します。

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

  10. 古いシャードの Rekor の公開鍵を取得します。

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

  11. 新しいログツリーを作成します。

    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

    これで、ログツリーが 2 つ、フリーズしたツリーが 1 つ、およびアクティブなシャードになる新しいツリーが 1 つできました。

  12. 新しい秘密鍵を作成します。

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

    重要

    新しい鍵には一意のファイル名が必要です。

  13. 新しい署名者鍵を使用して新しいシークレットリソースを作成します。

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

  14. 新しいツリー識別子と古いシャーディング情報を使用して、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
    Copy to Clipboard Toggle word wrap

    注記

    /spec/rekor/signer/keyPasswordRef に値が設定されている場合は、それを削除する新しい個別の更新を作成します。

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

    最初の更新を適用した後、この更新を適用します。

  15. Securesign インスタンスを更新します。

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

  16. Rekor サーバーが新しい署名者鍵で再デプロイされるのを待ちます。

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

  17. 新しい公開鍵を取得します。

    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

  18. 新しい Rekor 公開鍵を使用するように The Update Framework (TUF) サービスを設定します。

    1. シェル環境を設定します。

      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 ディレクトリー構造を作成します。

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

    3. 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}"
      Copy to Clipboard Toggle word wrap

    4. アクティブな Rekor 署名者鍵ファイル名を見つけます。ローカル TUF リポジトリー内の最新のターゲットファイル (例: 1.target.json) を開きます。このファイルには、アクティブな Rekor 署名者鍵ファイル名 (例: rekor.pub) が記載されています。次のアクティブな Rekor 署名者鍵ファイル名で環境変数を設定します。

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

    5. 古い公開鍵を使用して Rekor 署名者鍵を更新します。

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

    6. 古い 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}"
      Copy to Clipboard Toggle word wrap

    7. 新しい 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}"
      Copy to Clipboard Toggle word wrap

    8. これらの変更を TUF サーバーにアップロードします。

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

    9. 作業ディレクトリーを削除します。

      rm -r $WORK
      Copy to Clipboard Toggle word wrap

  19. 更新された TUF 設定で cosign 設定を更新します。

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

    これで、新しい 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 インスタンスを実行する。
  • ocopensslcosign バイナリーがインストールされたワークステーション。

手順

  1. OpenShift クラスターからワークステーションに tuftool バイナリーをダウンロードします。

    重要

    現在、tuftool バイナリーは、x86_64 アーキテクチャー上の Linux オペレーティングシステムでのみ使用できます。

    1. ホームページから ? アイコンをクリックして、Command line tools をクリックし、tuftool ダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルを開き、バイナリー .gz ファイルを展開し、実行ビットを設定します。

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

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      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

    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 プロジェクトに切り替えます。

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

  4. 現在の 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
    Copy to Clipboard Toggle word wrap

  5. 現在のツリー識別子を取得します。

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

  6. ログツリーを 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
    Copy to Clipboard Toggle word wrap

    ツリーログは、ドレイン中に新しいエントリーを受け入れません。キューが空になるまで待ちます。

    重要

    次のステップに進む前に、キューが空になるまで待つ必要があります。ドレイン中にリーフがまだ統合中の場合、このプロセス中にログツリーをフリーズすると、ログパスが最大マージ遅延 (MMD) しきい値を超える可能性があります。

  7. キューが完全に空になったら、ログをフリーズします。

    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. 新しい 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)
    Copy to Clipboard Toggle word wrap

  9. 新しい証明書と新しい公開鍵および秘密鍵を生成します。

    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"
    Copy to Clipboard Toggle word wrap

    CHANGE_ME は、新しいパスワードに置き換えます。

    重要

    証明書と新しい鍵には一意のファイル名が必要です。

  10. CT ログ設定を更新します。

    1. config.txtpb ファイルを開いて編集します。
    2. ログをフリーズした場合、フリーズされたログエントリーに 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"
        }
      Copy to Clipboard Toggle word wrap

      注記

      date +%s、および date +%N のコマンドを実行すると、秒とナノ秒の現在の時刻値を取得できます。

      重要

      not_after_limit フィールドは、フリーズされたログだけのタイムスタンプ範囲の終了を定義します。この時点以降の証明書は、このログに含めることができなくなります。

    3. 凍結されたログ config ブロックをコピーして貼り付け、設定ファイルに追加して新しいエントリーを作成します。
    4. 新しい config ブロック内の次の行を変更します。log_id を新しいツリー識別子に設定し、prefixtrusted-artifact-signerprivate_key パスを ctfe-keys/private に変更します。public_key 行は削除し、not_after_limitnot_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"
        }
      Copy to Clipboard Toggle word wrap

      NEW_TREE_ID を追加し、CHANGE_ME は、新しい秘密鍵のパスワードに置き換えます。ここでのパスワードは、新しい秘密鍵と公開鍵を生成するために使用したパスワードと同じものに指定する必要があります。

      重要

      not_after_start フィールドは、タイムスタンプ範囲の開始 (開始地点を含む) を定義します。これは、この時点でログが証明書の受け入れを開始することを意味します。

  11. 新しいシークレットリソースを作成します。

    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
    Copy to Clipboard Toggle word wrap

    CHANGE_ME は、新しい秘密鍵のパスワードに置き換えます。

  12. 新しい CT ログ公開鍵を使用するように The Update Framework (TUF) サービスを設定します。

    1. シェル環境を設定します。

      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 ディレクトリー構造を作成します。

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

    3. 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}"
      Copy to Clipboard Toggle word wrap

    4. アクティブな CT ログの公開鍵ファイル名を見つけます。ローカル TUF リポジトリー内の最新のターゲットファイル (例: 1.targets.json) を開きます。このターゲットファイルには、アクティブな CT ログ公開鍵ファイル名 (例: ctfe.pub) が含まれます。次のアクティブな CT ログ公開鍵ファイル名で環境変数を設定します。

      export ACTIVE_CTFE_NAME=ctfe.pub
      Copy to Clipboard Toggle word wrap

    5. OpenShift からアクティブな CT ログ公開鍵を抽出します。

      oc get secret $(oc get ctlog securesign-sample -o jsonpath='{.status.publicKeyRef.name}') -o jsonpath='{.data.public}' | base64 -d > $ACTIVE_CTFE_NAME
      Copy to Clipboard Toggle word wrap

    6. 古い 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}"
      Copy to Clipboard Toggle word wrap

    7. 新しい 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}"
      Copy to Clipboard Toggle word wrap

    8. これらの変更を TUF サーバーにアップロードします。

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

  13. 新しいツリー識別子を使用して 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"}
    	}
    ]
    EOF
    Copy to Clipboard Toggle word wrap

  14. Securesign インスタンスにパッチを適用します。

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

  15. CT ログサーバーが再びデプロイされるまで待ちます。

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

  16. 作業ディレクトリーを削除します。

    rm -r $WORK
    Copy to Clipboard Toggle word wrap

  17. 更新された TUF 設定で cosign 設定を更新します。

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

    これで、新しい CT ログ署名者鍵を使用してアーティファクトに署名し、検証する準備が整いました。

1.3.3. Fulcio 証明書のローテーション

Fulcio サービスで使用される証明書をプロアクティブにローテーションできます。この手順では、古い Fulcio 証明書の有効期限を切れさせ、Red Hat Trusted Artifact Signer (RHTAS) が使用できるように新しい証明書に置き換える手順を説明します。古い Fulcio 証明書の有効期限が切れても、古い証明書で署名されたアーティファクトを検証することは可能です。

前提条件

  • Red Hat OpenShift Container Platform 上で実行される RHTAS Operator をインストールする。
  • Securesign インスタンスを実行する。
  • ocopensslcosign バイナリーがインストールされたワークステーション。

手順

  1. OpenShift クラスターからワークステーションに tuftool バイナリーをダウンロードします。

    重要

    現在、tuftool バイナリーは、x86_64 アーキテクチャー上の Linux オペレーティングシステムでのみ使用できます。

    1. ホームページから ? アイコンをクリックして、Command line tools をクリックし、tuftool ダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルを開き、バイナリー .gz ファイルを展開し、実行ビットを設定します。

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

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      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

    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 プロジェクトに切り替えます。

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

  4. 新しい証明書と新しい公開鍵および秘密鍵を生成します。

    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
    Copy to Clipboard Toggle word wrap

    CHANGE_ME は、新しいパスワードに置き換えます。

    重要

    証明書と新しい鍵には一意のファイル名が必要です。

  5. 新規シークレットを作成します。

    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
    Copy to Clipboard Toggle word wrap

    CHANGE_ME は、新しいパスワードに置き換えます。

    注記

    ここでのパスワードは、新しい秘密鍵と公開鍵を生成するために使用したパスワードと同じものに指定する必要があります。

  6. 新しい Fulcio 証明書を使用するように The Update Framework (TUF) サービスを設定します。

    1. シェル環境を設定します。

      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 ディレクトリー構造を作成します。

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

    3. 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}"
      Copy to Clipboard Toggle word wrap

    4. アクティブな Fulcio 証明書ファイル名を見つけます。ローカル TUF リポジトリー内の最新のターゲットファイル (例: 1.targets.json) を開きます。このファイルには、アクティブな Fulcio 証明書ファイル名 (例: fulcio_v1.crt.pem) が記載されています。このアクティブな Fulcio 証明書ファイル名で環境変数を設定します。

      export ACTIVE_CERT_NAME=fulcio_v1.crt.pem
      Copy to Clipboard Toggle word wrap

    5. OpenShift からアクティブな Fulcio 証明書を抽出します。

      oc get secret $(oc get fulcio securesign-sample -o jsonpath='{.status.certificate.caRef.name}') -o jsonpath='{.data.cert}' | base64 -d > $ACTIVE_CERT_NAME
      Copy to Clipboard Toggle word wrap

    6. 古い証明書を期限切れにします。

      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}"
      Copy to Clipboard Toggle word wrap

    7. 新しい 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}"
      Copy to Clipboard Toggle word wrap

    8. これらの変更を TUF サーバーにアップロードします。

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

    9. 作業ディレクトリーを削除します。

      rm -r $WORK
      Copy to Clipboard Toggle word wrap

  7. 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"}]
    }
    ]
    EOF
    Copy to Clipboard Toggle word wrap

  8. Securesign インスタンスにパッチを適用します。

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

  9. 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
    Copy to Clipboard Toggle word wrap

  10. 更新された TUF 設定で cosign 設定を更新します。

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

    これで、新しい Fulcio 証明書を使用してアーティファクトに署名し、検証する準備が整いました。

1.3.4. タイムスタンプ機関の署名者鍵と証明書チェーンのローテーション

タイムスタンプ機関 (TSA) の署名者鍵と証明書チェーンをプロアクティブにローテーションできます。この手順では、古い TSA 署名者鍵と証明書チェーンを期限切れにし、Red Hat Trusted Artifact Signer (RHTAS) が使用できるように新しいものに置き換える手順を説明します。古い TSA 署名者鍵と証明書チェーンを期限切れにしても、古い鍵と証明書チェーンによって署名されたアーティファクトを検証することは可能です。

前提条件

  • Red Hat OpenShift Container Platform 上で実行される RHTAS Operator をインストールする。
  • Securesign インスタンスを実行する。
  • oc および openssl バイナリーがインストールされたワークステーション。

手順

  1. OpenShift クラスターからワークステーションに tuftool バイナリーをダウンロードします。

    重要

    現在、tuftool バイナリーは、x86_64 アーキテクチャー上の Linux オペレーティングシステムでのみ使用できます。

    1. ホームページから ? アイコンをクリックして、Command line tools をクリックし、tuftool ダウンロードセクションに移動し、プラットフォームのリンクをクリックします。
    2. ワークステーションでターミナルを開き、バイナリー .gz ファイルを展開し、実行ビットを設定します。

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

    3. バイナリーを $PATH 環境内の場所に移動し、名前を変更します。

      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

    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 プロジェクトに切り替えます。

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

  4. 新しい証明書チェーンと新しい署名者鍵を生成します。

    重要

    新しい証明書と鍵には一意のファイル名が必要です。

    1. 一時作業ディレクトリーを作成します。

      mkdir certs && cd certs
      Copy to Clipboard Toggle word wrap

    2. ルート認証局 (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"
      Copy to Clipboard Toggle word wrap

      CHANGE_ME は、新しいパスワードに置き換えます。

    3. 中間 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"
      Copy to Clipboard Toggle word wrap

      CHANGE_ME は、新しいパスワードに置き換えます。

    4. ルート 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"
      Copy to Clipboard Toggle word wrap

      中間 CA 証明書に署名するには、CHANGE_ME をルート CA 秘密鍵のパスワードに置き換えます。

    5. リーフ 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"
      Copy to Clipboard Toggle word wrap

    6. 中間 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"
      Copy to Clipboard Toggle word wrap

      リーフ CA 証明書に署名するには、CHANGE_ME を中間 CA 秘密鍵のパスワードに置き換えます。

    7. 新しく作成した証明書を組み合わせて証明書チェーンを作成します。

      cat leafCA.crt.pem intermediateCA.crt.pem rootCA.crt.pem > new-tsa.certchain.pem
      Copy to Clipboard Toggle word wrap

  5. 署名者鍵を使用して新しいシークレットリソースを作成します。

    oc create secret generic rotated-signer-key --from-file=rotated-signer-key=certs/leafCA.key.pem
    Copy to Clipboard Toggle word wrap

  6. 新しい証明書チェーンを使用して新しいシークレットリソースを作成します。

    oc create secret generic rotated-cert-chain --from-file=rotated-cert-chain=certs/new-tsa.certchain.pem
    Copy to Clipboard Toggle word wrap

  7. パスワード用の新しいシークレットリソースを作成します。

    oc create secret generic rotated-password --from-literal=rotated-password=CHANGE_ME
    Copy to Clipboard Toggle word wrap

    CHANGE_ME を中間 CA 秘密鍵のパスワードに置き換えます。

  8. アクティブな 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
    Copy to Clipboard Toggle word wrap

  9. 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
    Copy to Clipboard Toggle word wrap

  10. Securesign インスタンスにパッチを適用します。

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

  11. TSA サーバーが新しい署名者鍵と証明書チェーンを使用してもう一度デプロイされるのを待ちます。

    oc get pods -w -l app.kubernetes.io/name=tsa-server
    Copy to Clipboard Toggle word wrap

  12. 新しい証明書チェーンを取得します。

    export NEW_CERT_CHAIN_NAME=new-tsa.certchain.pem
    curl $TSA_URL/certchain -o $NEW_CERT_CHAIN_NAME
    Copy to Clipboard Toggle word wrap

  13. 新しい TSA 証明書チェーンを使用するように The Update Framework (TUF) サービスを設定します。

    1. シェル環境を設定します。

      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 ディレクトリー構造を作成します。

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

    3. 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}"
      Copy to Clipboard Toggle word wrap

    4. 古い 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}"
      Copy to Clipboard Toggle word wrap

    5. 新しい 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}"
      Copy to Clipboard Toggle word wrap

    6. これらの変更を TUF サーバーにアップロードします。

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

    7. 作業ディレクトリーを削除します。

      rm -r $WORK
      Copy to Clipboard Toggle word wrap

  14. 更新された TUF 設定で cosign 設定を更新します。

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

    これで、新しい TSA 署名者鍵と証明書を使用するアーティファクトに署名して検証する準備が整いました。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat