かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  vol.156 Hyper-V環境の移行: Hyper-Vホストに迫る10年の期限|Windows Server 2016 EOSまであと418日

 

 

vol.156 Hyper-V環境の移行: Hyper-Vホストに迫る10年の期限|Windows Server 2016 EOSまであと418日

2025年11月20日配信
2025年11月20日更新
執筆者:山内 和朗

 Windows Server 2016の製品ライフサイクルとサポート終了日(End of LifeCycle《EOL》、End of Support《EOS》)である2027年1月12日までまだ1年以上ありますが、対策に着手するには遅すぎるくらいです。前回は、新しいHyper-VホストにVMを移行する際の、vTPMのエラー解消方法を説明しました。今回は、この問題に関連して、Windows Server 2016以降のHyper-Vホストには10年というライフサイクル問題が存在するかもしれないという話。

 

vTPMのための自己署名証明書の有効期限は10年

 

 前回は、Hyper-Vホストから仮想TPMデバイス(vTPM)が有効なVMをエクスポート/インポートしてVMを移行(移動)する場合、ライブマイグレーションで別のHyper-VホストやHyper-Vホストクラスターのノード間でVMを移行する場合、あるいはHyper-VレプリカでVMをセカンダリサーバーにフェールオーバーする場合は、vTPMに関係する2つの証明書も合わせて移行する必要があることを説明しました。

 Hyper-VホストのvTPM用証明書は、ローカルコンピューターの証明書ストア(certlm.msc)の「シールドVMのローカル証明書(¥証明書)」(cert:¥localmachine¥Shielded VM Local Certificates)にある以下の2つの自己署名証明書です。なお、証明書の名前の“コンピューター名”の部分は、Hyper-Vホスト上のVMで初めてvTPMが有効化されたときのものであり、現在のコンピューター名とは一致しない場合があります。

 

Shielded VM Encryption Certificate (UntrustedGuardian)(コンピューター名)
Shielded VM Signing Certificate (UntrustedGuardian)(コンピューター名)


 これらの証明書が移行先のHyper-Vホストで利用できない場合、vTPMの初期化(キーの保護機能のラップ解除)に失敗して、VMを起動できません。また、シェアードナッシング・ライブマイグレーションでは、ハードウェアの不一致を検出し、移行がブロックされます。Hyper-VホストクラスターにおけるVMのライブマイグレーションでも、キーの保護機能のラップ解除の失敗が原因でノード間でVMを移動できません。

 vTPM用の自己署名証明書は、そのHyper-Vホストで作成されたVMでvTPMを有効にしたときに、ローカルの証明書ストア「シールドVMのローカル証明書」にまだ存在しなければ、あるいはこの証明書ストアが存在しなければ、自動生成されます。その自己署名証明書の有効期限は10年であり、有効期限が切れると、証明書は自動的に失効します。証明書が失効したとしても自動的に再生成されることはありません。そのため、既に有効化されているVMのvTPMには影響しませんが、新規VMでのvTPMの有効化に影響します。

 Windows Server 2016のHyper-Vホストを、直接的あるいは途中バージョンを挟んでWindows Server 2025にインプレースアップグレードした場合、有効期限が新たな10年を刻み始めることはありません。既に生成済みの証明書が存在すれば、有効期限を含めてそのまま引き継がれ、vTPMのために利用されます。2世代VMのvTPMのサポートは、Windows Server 2016(2016年10月リリース)からです。いち早く導入されたHyper-Vホストは2026年10月以降、次々に期限を迎えてしまうでしょう。

 

vTPM用の自己署名証明書を再生成するには

 

 ローカルのHyper-VのvTPM用自己署名証明書は、PowerShellコマンドレット「Remve-HgsGuardian -Name "UntrustedGuardian"」を実行後に、削除することができます。ただし、旧証明書は削除せずに残しておいても問題ありません。旧証明書を使用して有効化されたVMのvTPMは、その証明書が存在する限り、証明書の失効状態に関係なく機能します。Remove-HgsGuardianを実行後に、新しいVMを作成し、vTPMを有効化すると、新しい証明書が自動生成されます(画面1)。自己署名証明書の再生成後に作成されたVMのvTPM、および過去にvTPMが一度も有効化されたことのない既存のVMのvTPMの有効化には、新しい自己署名証明書が使用されます。

 

画面1 「Remove-HgsGuardian -Name "UntrustedGuardian"」を実行すると、既存の証明書を削除できる旨のメッセージが表示されるが、既存のVMのために残しておくことを推奨。新規のVMでvTPMを有効化すれば、新しい証明書が再生成される

画面1 「Remove-HgsGuardian -Name "UntrustedGuardian"」を実行すると、既存の証明書を削除できる旨のメッセージが表示されるが、既存のVMのために残しておくことを推奨。新規のVMでvTPMを有効化すれば、新しい証明書が再生成される

 

 ローカルのHyper-VホストのvTPM用自己署名証明書を再生成する一連の作業は、VMの作成やvTPMの有効化なしで、次のコマンドラインをPowerShellで実行することに置き換えることができます。最後の、New-HgsGuardianコマンドレットは新しい自己署名証明書を自動生成させるコマンドラインです(画面2)。

 

# UntrustedGuardianが存在することを確認します。

Get-HgsGuardian  

# UntrustedGuardianを削除します。

Remove-HgsGuardian -Name "UntrustedGuardian"
警告: ガーディアンが正常に削除されました。他の用途がない場合は、ガーディアンに関連付けられている次の証明書を手動で 削除します。
Cert:\LocalMachine\Shielded VM Local Certificates\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Cert:\LocalMachine\Shielded VM Local Certificates\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

# 上記の警告にある証明書を必要に応じて削除します。

# 注: 削除するとこれらの証明書で有効化された既存VMのvTPMが利用できなくなります。

# Remove-Item "Cert:\LocalMachine\Shielded VM Local Certificates\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

# Remove-Item "Cert:\LocalMachine\Shielded VM Local Certificates\YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"

# 自己署名証明書を再生成します。

New-HgsGuardian -Name "UntrustedGuardian" -GenerateCertificates

 

画面2 PowerShellスクリプトを実行して、自己署名証明書を再生成させる。旧証明書は既存のvTPMが有効なVMのために削除せずに残す

画面2 PowerShellスクリプトを実行して、自己署名証明書を再生成させる。旧証明書は既存のvTPMが有効なVMのために削除せずに残す

 

旧証明書を削除してしまった場合は...


 旧証明書を削除してしまった場合、既存のVMのvTPMの構成には使用できなくなるため、起動できなくなったり、vTPMのオン/オフをできなくなったりします。の場合、多少面倒ですが、新規にVMを作成し、VMの設定と仮想ハードディスク(VHD(x))の割り当てを新しいVMに復元して、その後、vTPMを有効にすることで対処できます(画面3)。この方法は、別のHyper-Vホストから移行したVMで、既に移行元を撤去し、vTPM用の自己署名証明書が失われてしまった場合にも適用できます。

 

画面3 証明書が再生成されると、既存のVMでのvTPMのオフ/オンはエラーになるので、新規にVMを作成し、設定と仮想ハードディスク(VHD(x))の接続を復元することで対処する。まっさらなvTPMからのスタートなので、セキュリティ機能の再設定が必要になる場合がある

画面3 旧証明書を削除してしまった場合は、新規にVMを作成し、設定と仮想ハードディスク(VHD(x))の接続を復元することで対処する。まっさらなvTPMからのスタートなので、セキュリティ機能の再設定が必要になる場合がある


 VMを作り直した場合、そのTPMはまっさらな状態(暗号化キーなど何も格納されていない状態)からのスタートとなるため、ゲストOSのセキュリティ機能に影響したり、セキュリティ機能の再構成が必要になることがあります。例えば、OSボリュームがBitLockerドライブ暗号化で保護されている場合、新しいTPM(まっさらなTPM)では暗号化ロックを解除できないため、回復キーを使用して起動したあと、BitLockerを再セットアップ(BitLockerの無効化、有効化)する必要があります。BitLockerとMeasure Boot(セキュアブート+仮想化ベースのセキュリティ+TPM)が有効になっている場合はセキュアブートポリシーの予期しない変更とみなされ、やはり回復キーが要求されます(画面4)。PowerShellやmanage-bdeコマンドを使用して再セットアップするには、OS起動後に次のように実行します。

 

PS C:\> Disable-Bitlocker C:

PS C:\> Get-BitLockerVolume C:  #暗号化の完全な解除を確認

PS C:\> Enable-Bitlocker C: -TpmProtector

PS C:\> Add-BitlockerkeyProtector -MountPoint c -RecoveryPasswordProtector  #回復キーを控える

または

C:\> manage-bde -off c:

C:\> manage-bde -status c:  #暗号化の完全な解除を確認

C:\> manage-bde -on c:

C:\> manage-bde -protectors -add RecoveryPassword c:  #回復キーを控える

 

画面4 新規VMに設定を復元して起動しても、現在のvTPMはBitLockerのTPMプロテクターとしては機能しなくなるので、回復キーを入力して起動後、BitLockerを再セットアップする必要がある。Measure Bootが機能している場合は、セキュアブートポリシーの予期しない変更と判断され、やはり回復キーの入力が要求される(画面手前)

画面4 新規VMに設定を復元して起動しても、現在のvTPMはBitLockerのTPMプロテクターとしては機能しなくなるので、回復キーを入力して起動後、BitLockerを再セットアップする必要がある。Measure Bootが機能している場合は、セキュアブートポリシーの予期しない変更と判断され、やはり回復キーの入力が要求される(画面手前)

 

 この他、MeasureBootの機能に依存するセキュリティサービス(Intuneなど)を利用している場合、TPMに格納されているはずの測定値が失われるため、セキュリティ基準を満たしていないデバイスと判定されるなどの影響が予想できます。

 

 vTPM関連の証明書を更新する方法については、以下の公式ブログの「Updating vTPM related certificates.」で別の方法が説明されていますが、その方法は“現在の”ローカルの証明書を使用して、新しいキー保護の設定をしているだけのようで(Set-VMKeyProtector -NewLocalKeyProtector)、証明書の有効期限を更新する効果はない気がします。

Hyper-V Virtual TPMs, Certificates, VM Export and Migration|Tech Community(Microsoft)

 

有効期限切れになるとどうなる? 一見影響なさそうだけど...

 

 試しに、システム時刻を10年以上先に設定して、現在のvTPM用自己署名証明書を失効させてみました。既存のVMのvTPMのオン/オフやVMの起動には影響しないようで、正常に動作しているように見えます(画面5)。

 

画面4 証明書の有効期限が切れた日付に変更してみたが、既存のvTPMが有効なVMは問題なく、起動できている
画面5 証明書の有効期限が切れた日付に変更してみたが、既存のvTPMが有効なVMは問題なく、起動できている

 しかし、新規に作成したVMでvTPMをオンにしたり、既存のVMのキー保護設定を更新(リセット)しようとしたりすると、証明書の期限切れを理由に失敗するようになりました(画面6)。

 

画面5 新規に作成したVMでvTPMを有効化したり、既存のVMのキー保護設定を更新しようとすると、有効期限切れを理由に失敗
画面6 新規に作成したVMでvTPMを有効化したり、既存のVMのvTPMをリセットしようとすると、有効期限切れを理由に失敗

 Hyper-Vホストは、Windows Serverのライフサイクルと同じ10年を超えた長いライフライクルで利用されることは想定されていなかったのかもしれません。旧バージョンのHyper-VホストからインプレースアップグレードしたHyper-VホストのvTPM関連の証明書の有効期限は残りわずかかもしれないので、その有効期限を確認し、期限切れになる前に対処することをお勧めします。なお、VMとともにインポートした証明書の有効期限は気にする必要ありません。その証明書が存在する限り、有効化済みのvTPMに影響することはありません。

 

PowerShellスクリプトで一括エクスポート/インポート

 

 最後に、vTPM用自己署名証明書のエクスポートとインポートの作業を簡素化できるように、PowerShellスクリプト「exportvtpmcert.ps1」と「importvtpmcert.ps1」を作成しました。

 

 「exportvtpmcert.ps1」は、ローカルコンピュータ用の署名および暗号化用自己署名証明書(Shielded VM Signing Certificate (UntrustedGuardian) (コンピューター名)およびShielded VM Encryption Certificate (UntrustedGuardian) (コンピューター名))をPFXファイル(既定でc:¥workに)にエクスポートします。なお、「exportvtpmcert.ps1」は、現在のコンピューター名と証明書の名前に含まれるコンピューター名が一致している(コンピューター名を変更していない)ことを想定しています。

 

 「importvtpmcert.ps1」は別のHyper-VホストでエクスポートされたPFXファイルをローカルコンピューターにインポートします(画面7)

 

vol156_scr07c

画面7 「exportvtpmcert.ps1」でエクスポートしたPFXファイルを「importvtpmcert.ps1」でインポートする

 

[exportvtpmcert.ps1]プレーンテキストで表示)

$tempPath = "c:\work"
$password = "P@ssword"
if (Test-Path ($tempPath)) {
$certs = Get-Item "cert:\localmachine\Shielded VM Local Certificates\*"
ForEach ($cert in $certs) {
if (($cert.Subject).contains($env:COMPUTERNAME)) {
$filename = ($cert.Subject -replace "CN=","") -replace " ", "_"
$filename = $filename + ".pfx"
$filename = Join-Path $tempPath $filename
certutil -exportPFX -p $password "Shielded VM Local Certificates" $cert.Thumbprint $filename
}
}
} else {
Write-Host "$($tempPath) does not exist."
}

[importvtpmcert.ps1]プレーンテキストで表示)

$tempPath = "c:\work"
$password = "P@ssword"
if (Test-Path ($tempPath)) {
$certs = Get-Item (Join-Path $tempPath "*.pfx")
if ($certs.Count -gt 0) {
If (!(test-path "cert:\localmachine\Shielded VM Local Certificates")){
New-Item -Path "cert:\localmachine" -Name "Shielded VM Local Certificates"
}
ForEach ($cert in $certs) {
$filename = Join-Path $tempPath $cert.Name
Import-PfxCertificate -FilePath $filename -CertStoreLocation "Cert:\LocalMachine\Shielded VM Local Certificates" -Password (ConvertTo-SecureString -String $password -Force -AsPlainText)
}
} else {
Write-Host "PFX file does not exist in $($tempPath) ."
}
} else {
Write-Host "$($tempPath) does not exist."
}

 

Windows Server 2016 EOSまであとX日(1)|...|(11)(12)(13)(14)|(15)

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_ws2025

最新記事