Windowsのビルドサーバーに Visual Studio 2022 Build Tools を導入する際、ブートストラッパーがダウンロードした vs_installer.opc の署名検証で失敗し、インストールが先に進まない――そんな現場トラブルを確実に潰すための実践記事です。証明書の発行者と信頼チェーン、検証コマンド、ネットワーク要件、オフライン導入、ログの読み方、GPO/WSUS 配布まで「そのまま運用の手順書にできる」粒度でまとめました。
Visual Studio 2022 Build Tools の導入時に発生する「vs_installer.opc の証明書検証エラー」の正体
vs_installer.opc は Visual Studio Installer が自動で取得するパッケージ(Open Packaging Conventions 形式)で、署名が正しく検証できなければ安全上の理由からセットアップが中断されます。多くのケースでは「信頼チェーンの不足」「失効情報の取得失敗」「TLS/プロキシ設定の不整合」「ダウンロード破損」のいずれかが原因です。
まず把握すべきは「どの証明書で署名され、どのルートまで連なっているか」です。署名者そのもののチェーンと、タイムスタンプのカウンター署名のチェーンは別物であり、それぞれが正しく検証される必要があります。
署名/検証に関わる証明書の要点
| 目的 | 手順/ポイント |
|---|---|
| 署名に使われる証明書 | 署名者(例): Microsoft Corporation 中間CA(例): Microsoft Code Signing PCA(運用時期により 2011/2023 等のバリアントあり) ルート(例): Microsoft Root Certificate Authority 系列 タイムスタンプのカウンター署名(例): DigiCert Timestamp 2021 など → DigiCert Trusted Root G4 に連なるチェーン 環境や時期により表示される中間/ルート名は若干異なることがあります。署名者のチェーンとタイムスタンプのチェーンの双方が信頼できることを確認してください。 |
| ファイルの署名確認方法 | 該当ファイル(例: C:\ProgramData\Microsoft\VisualStudio\Packages\_bootstrapper\vs_installer.opc あるいは %ProgramData% 配下)を右クリック → プロパティ → デジタル署名 タブ。 詳細 → 証明書の表示 で「発行者: Microsoft」「有効期限内」「信頼済み」を確認。(タイムスタンプの「カウンター署名」が DigiCert Trusted Root G4 チェーンになっていることも確認) CLI なら下記コマンドが有用です。 # PowerShell(推奨) Get-AuthenticodeSignature ` "C:\ProgramData\Microsoft\VisualStudio\Packages\_bootstrapper\vs_installer.opc" | Format-List * # signtool(Visual Studio 付属) signtool verify /pa /all /v ^ "C:\ProgramData\Microsoft\VisualStudio\Packages_bootstrapper\vs_installer.opc" # Sysinternals sigcheck(管理者で実行) sigcheck.exe -i -q ^ "C:\ProgramData\Microsoft\VisualStudio\Packages_bootstrapper\vs_installer.opc" |
| 検証が失敗する主な原因 | ルート/中間証明書がサーバーに存在しない、または期限切れ。 インターネット到達性やプロキシ制限により、証明書の失効情報(CRL/OCSP)や中間証明書の取得に失敗。 vs_installer.opc のダウンロード破損(キャッシュ不整合を含む)。 TLS 1.2 が無効、あるいは SSL インスペクション/証明書書換が介在して検証不可。 |
| 推奨対応策 | ルート証明書を更新: オフライン OS 更新、またはルート/中間証明書の手動インポート(特に DigiCert Trusted Root G4 と Microsoft Code Signing PCA 系列)。 ネットワーク確認: download.visualstudio.microsoft.com、visualstudio.microsoft.com、aka.ms、および crl.microsoft.com / ocsp.msocsp.com / ocsp.digicert.com など失効配布ポイントへの TLS 1.2 接続を許可。 オフラインレイアウト: vs_BuildTools.exe --layout C:\VS2022Offline --lang ja-JP で全パッケージを事前取得し、ローカル完結で検証。 ファイル整合性: Get-FileHash(SHA-256)で破損を排除。キャッシュは安全にクリアして再取得。 |
補足: Windows Server 2012 R2 以前はルート証明書の自動更新が抑制されている環境があり、[信頼されたルート証明機関]ストアへ DigiCert G4 ルートを手動インポートすると解決する例が多くあります。オフライン寄りの環境では オフラインレイアウト+WSUS/GPO でルート/中間証明書を配布すると再発を防ぎやすくなります。インストールログ(例: %TEMP%\dd_installer_*.log)に “Signature verification failed for vs_installer.opc” があれば、まず証明書チェーンを疑うのが近道です。
実運用で使える診断手順(最短ルート)
- 現在のファイルと署名を確認
$path = "C:\ProgramData\Microsoft\VisualStudio\Packages\_bootstrapper\vs_installer.opc" Get-Item $path | Format-List Name,Length,CreationTime Get-AuthenticodeSignature $path | fl Get-FileHash $path -Algorithm SHA256サイズが極端に小さい/大きい場合やハッシュが変化する場合はダウンロード破損を疑います。 - 証明書ストアの健全性を確認
# ルート & 中間の一覧をテキスト化して目視確認 certutil -store root | Out-File "$env:TEMP\root.txt" -Encoding utf8 certutil -store CA | Out-File "$env:TEMP\intermediate.txt" -Encoding utf8 # 代表的な名前が存在するかをざっくり検索 Select-String -Path "$env:TEMP\root.txt","$env:TEMP\intermediate.txt" ` -Pattern "DigiCert Trusted Root G4","Microsoft Code Signing PCA","Microsoft Root" - 失効情報(CRL/OCSP)の取得可否を検証 GUI の
certutil -urlが簡便です。対象ファイルを指定し Retrieve を押して AIA/CRL/OCSP が SUCCESS となるか確認します。certutil -url "C:\ProgramData\Microsoft\VisualStudio\Packages_bootstrapper\vs_installer.opc"プロキシや SSL インスペクションがある場合は*.microsoft.comと*.digicert.comの CRL/OCSP を素通しにする運用が安全です。 - TLS 1.2 と .NET 強力暗号の有効化
# TLS 1.2(クライアント)の有効化(再起動推奨) New-Item "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -Force | Out-Null New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -Name Enabled -Value 1 -PropertyType DWord -Force | Out-Null New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -Name DisabledByDefault -Value 0 -PropertyType DWord -Force | Out-Null # .NET 4.x の強力暗号化(SchUseStrongCrypto) New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft.NETFramework\v4.0.30319" -Name SchUseStrongCrypto -Value 1 -PropertyType DWord -Force | Out-Null New-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft.NETFramework\v4.0.30319" -Name SchUseStrongCrypto -Value 1 -PropertyType DWord -Force | Out-Null - オフラインレイアウトで切り分け インターネット到達性が原因かを切り分けるため、別のインターネット接続可能な PC でオフラインレイアウトを作成し、対象サーバーに持ち込みます。
# オフラインレイアウトを作成(日本語・最小構成の例) .\vs_BuildTools.exe --layout C:\VS2022Offline --lang ja-JP # 代表的なワークロード(例: C++ ビルドツール)をインストール C:\VS2022Offline\vs_BuildTools.exe --quiet --wait --norestart ` --installPath "C:\BuildTools"` --add Microsoft.VisualStudio.Workload.VCToolsオフラインで成功するなら、オンライン経路(プロキシ/フィルタ/SSL インスペクション/失効配布)の見直しが必要です。 - ログの読み方
%TEMP%配下にdd_installer_*.logなどが生成されます。以下のような文言があれば証明書の問題が濃厚です。Signature verification failed for vs_installer.opc A required certificate is not within its validity period A certificate chain processed, but terminated in a root certificate which is not trusted併せて アプリケーションとサービス ログ → Microsoft → Windows → CAPI2 → Operational を有効化すると、チェーンビルド/失効参照の詳細が得られます。
ネットワーク/プロキシ/ファイアウォールの要件チェックリスト
| 区分 | 宛先(例) | 用途 | 要件 |
|---|---|---|---|
| VS インストーラ | download.visualstudio.microsoft.com, visualstudio.microsoft.com, aka.ms | パッケージ取得、ブートストラップ | TLS 1.2 / ポート 443、SSL インスペクションの回避推奨 |
| Microsoft 失効 | crl.microsoft.com, ocsp.msocsp.com | コード署名/ルートの失効確認 | HTTP/HTTPS 可。キャッシュ/プロキシで改変しないこと |
| DigiCert 失効 | ocsp.digicert.com, crl3.digicert.com など | タイムスタンプの失効確認 | HTTP/HTTPS 可。SSL インスペクション対象外に |
| 時刻同期 | NTP(社内 NTP / 外部 NTP) | 時刻ずれ防止 | ±5 分以内を維持。w32tm /resync 推奨 |
SSL インスペクション(TLS 終端)やプロキシの自己署名証明書をクライアントに配布している場合、コード署名の検証に関わる通信は必ず素通しにしてください。改ざんと見なされ、検証に失敗します。
ルート/中間証明書を安全に配布・導入する(GPO/WSUS/手動)
GPO(推奨/ドメイン環境)
- グループ ポリシーの管理 → 対象 OU の GPO を作成/編集。
- コンピューターの構成 → ポリシー → Windows の設定 → セキュリティの設定 → 公開キーのポリシー。
- 信頼されたルート証明機関 と 中間証明機関 に必要な
.cer/.crtをインポート(例: DigiCert Trusted Root G4、Microsoft Code Signing PCA)。
手動(オフライン/スタンドアロン)
# ルート証明書のインポート(ローカル コンピューター)
certutil -addstore -f root .\DigiCertTrustedRootG4.crt
# 中間証明書のインポート(中間証明機関ストア)
certutil -addstore -f CA .\MicrosoftCodeSigningPCA.crt
注意: 出所の確かな証明書ファイルのみを使用してください。未知の証明書をルートに入れることは厳禁です。
オフラインレイアウトでの安定導入(再発防止)
ネットワークの都度調整が難しいビルドサーバーでは「オフラインレイアウト+共有ストレージ」運用が堅実です。
- インターネット接続可能な運用端末でレイアウト作成:
.\vs_BuildTools.exe --layout \\filesrv\VS2022Offline --lang ja-JP - 必要なワークロード/コンポーネントを指定してサイレント導入:
\\filesrv\VS2022Offline\vs_BuildTools.exe --quiet --wait --norestart ` --installPath "C:\BuildTools" ` --add Microsoft.VisualStudio.Workload.VCTools ` --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 - レイアウトの定期更新をジョブ化(メンテナンス窓口で実行)。
この方式なら vs_installer.opc の検証を含む一連の処理がローカルに閉じ、失効配布ポイントの一時的な到達性低下やプロキシ設定変更の影響をほぼ排除できます。
キャッシュ不整合や破損を疑うときの整備ポイント
- ダウンロードキャッシュの整理:
C:\ProgramData\Microsoft\VisualStudio\Packages\_bootstrapperのみをサービス停止の上で退避(削除でなくren)。 - セキュリティ製品の一時無効化は最後の手段:リアルタイム保護が OPC の展開を妨げることがありますが、ポリシー順守の範囲で短時間のみ実施。
- ゾーン情報の解除:ネットワークドライブ経由の入手物は
Unblock-Fileを実行。Get-ChildItem \\filesrv\VS2022Offline -Recurse -File | Unblock-File
よくあるエラーコードと読み替え(早見表)
| エラー/症状 | 意味 | 主原因 | 対処 |
|---|---|---|---|
| 0x800B0109 | 信頼されていないルートで連鎖が終了 | ルート証明書未導入 | 正しいルート(例: Microsoft Root / DigiCert G4)を配布 |
| 0x800B010A / 有効期限外 | 証明書の有効期間不一致 | サーバー時刻ずれ、古い中間CA | 時刻同期、最新の中間CAを導入 |
| “Signature verification failed for vs_installer.opc” | 署名検証に失敗 | チェーン不足、失効確認不可、破損 | ストア/失効/ネットワーク/ハッシュを順に点検 |
Enterprise 向けテンプレート:ビルドサーバー展開チェックリスト
- OS & 更新: 最新の累積更新/セキュリティロールアップ適用。
- 証明書: ルート(Microsoft 系列、DigiCert Trusted Root G4)・中間(Microsoft Code Signing PCA)を配布済み。
- ネットワーク: 前述ホストへの 443/TLS1.2 到達性、SSL インスペクション除外。
- 時刻同期: ドメイン/NTP の二重化、
w32tm /monitorによる遅延監視。 - オフラインレイアウト: 共有配置 + 月次更新をジョブ化。
- 監査: CAPI2 Operational ログを有効、失敗時は
EventID 11/70を収集。 - 復旧手順: キャッシュ退避 → レイアウトから再導入 → ログ採取の順で標準化。
「Windows Server 2012 R2 以前」への注意点
これらの環境では自動ルート更新が停止/制限されている構成が残っていることがあります。GPO または手動でのルート/中間配布に加え、TLS 1.2 のレジストリ有効化と .NET 強力暗号の設定を必ず併用してください。インターネット非到達なセグメントでは、オフラインレイアウト+WSUS による配布が実運用上は最も堅牢です。
最後に:原因切り分けの順番を固定すると強い
トラブルの現場では「ネットワークを疑う前に証明書ストア」「通信要件を確認してからリトライ」「駄目ならオフラインで切り分け」という順を常套化するのが肝要です。特に vs_installer.opc の失敗は チェーン不足と失効確認不可が大半を占めます。この記事のコマンドとチェックリストを標準手順に落とし込めば、再発時の復旧時間を大幅に短縮できるはずです。
付録:一括自動化サンプル(PowerShell)
以下は「TLS 1.2 有効化」「.NET 強力暗号化」「代表的な証明書のインポート」「失効テスト」までをまとめて行うサンプルです。導入前に検証環境で試し、証明書ファイルの出所とハッシュを必ず確認してください。
# ----- 事前: .\DigiCertTrustedRootG4.crt と .\MicrosoftCodeSigningPCA.crt を同ディレクトリに配置 -----
# 1) TLS 1.2 & .NET 強力暗号
$schannel = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client"
New-Item $schannel -Force | Out-Null
New-ItemProperty $schannel -Name Enabled -Value 1 -PropertyType DWord -Force | Out-Null
New-ItemProperty $schannel -Name DisabledByDefault -Value 0 -PropertyType DWord -Force | Out-Null
foreach($k in "HKLM:\SOFTWARE\Microsoft.NETFramework\v4.0.30319","HKLM:\SOFTWARE\WOW6432Node\Microsoft.NETFramework\v4.0.30319"){
New-ItemProperty $k -Name SchUseStrongCrypto -Value 1 -PropertyType DWord -Force | Out-Null
}
# 2) 証明書インポート(ルート/中間)
Write-Host "Importing DigiCert G4 Root..." -ForegroundColor Cyan
certutil -addstore -f root .\DigiCertTrustedRootG4.crt
Write-Host "Importing Microsoft Code Signing PCA..." -ForegroundColor Cyan
certutil -addstore -f CA .\MicrosoftCodeSigningPCA.crt
# 3) vs_installer.opc 署名確認(存在する場合)
$opc = "C:\ProgramData\Microsoft\VisualStudio\Packages_bootstrapper\vs_installer.opc"
if(Test-Path $opc){
Get-AuthenticodeSignature $opc | Format-List * | Out-Host
certutil -url $opc
}else{
Write-Warning "vs_installer.opc が見つかりません。ブートストラッパーを一度実行して取得してください。"
}
まとめ:現場で即使える結論
- 署名者チェーン(Microsoft Code Signing PCA → Microsoft Root)とタイムスタンプチェーン(DigiCert Timestamp → DigiCert Trusted Root G4)の双方を満たす。
- CRL/OCSP 到達性とTLS 1.2を保証。SSL インスペクションは対象外に。
- オフラインレイアウトとルート/中間の GPO 配布で再発を予防。
- 失敗時は 署名→ストア→失効→ネットワーク→ハッシュ→ログの順に切り分ける。

コメント