仕組みはわかっとるしスクリプト流したいんじゃなくてシンプルに現状の確認をするワンライナーだけコピペしたいんじゃ、Windowsですませたいんじゃ。というときのコマンド集
Contents
DBやKEKに新しい2023 CA証明書があるか雑に確認したい
頭に sudo powershell とつけるか、管理者PowerShellにて動作させる。それぞれTrueならば存在している。精確に見たい場合は後述。secure bootが無効になっている場合はGet-SecureBootUEFIがこける。
|
1 2 3 |
[System.Text.Encoding]::ASCII.GetString((Get-SecureBootUEFI DB).Bytes) -match 'Windows UEFI CA 2023' [System.Text.Encoding]::ASCII.GetString((Get-SecureBootUEFI DB).Bytes) -match 'Microsoft UEFI CA 2023' [System.Text.Encoding]::ASCII.GetString((Get-SecureBootUEFI KEK).Bytes) -match 'Microsoft Corporation KEK 2K CA 2023' |
DBやKEKに話題の期限が切れるCA証明書があるか雑に確認したい
頭に sudo powershell とつけるか、管理者PowerShellにて動作させる。それぞれTrueならば存在している。精確に見たい場合は後述
|
1 2 3 |
[System.Text.Encoding]::ASCII.GetString((Get-SecureBootUEFI DB).Bytes) -match 'Microsoft Windows Production PCA 2011' [System.Text.Encoding]::ASCII.GetString((Get-SecureBootUEFI DB).Bytes) -match 'Microsoft Corporation UEFI CA 2011' [System.Text.Encoding]::ASCII.GetString((Get-SecureBootUEFI KEK).Bytes) -match 'Microsoft Corporation KEK CA 2011' |
DBXに話題のCA証明書が強制的につっこまれているかを雑に確認したい
頭に sudo powershell とつけるか、管理者PowerShellにて動作させる。それぞれTrueならば存在している。精確に見たい場合は後述
|
1 2 3 4 |
# BlackLotus [System.Text.Encoding]::ASCII.GetString((Get-SecureBootUEFI DBX).Bytes) -match 'Microsoft Windows Production PCA 2011' #[System.Text.Encoding]::ASCII.GetString((Get-SecureBootUEFI DBX).Bytes) -match 'Microsoft Corporation UEFI CA 2011' |
ブートマネージャ(.efi)の署名から証明書のNotAfterとSubjectを表示する
管理者PowerShellにて動作させる。Windowsのブートマネージャ以外はファイル名を変える。EFIがあるパーティション(ESP)は「ディスクの管理(diskmgmt.msc)」のボリューム列などでディスク番号とパーティション番号を調べて、2行目のHarddisk0やPartition1の数字部分をその数字に変更
|
1 2 3 |
$chain = New-Object System.Security.Cryptography.X509Certificates.X509Chain $chain.Build((Get-AuthenticodeSignature "\\?\Harddisk0Partition1\EFI\Microsoft\Boot\bootmgfw.efi").SignerCertificate) $chain.ChainElements | ForEach-Object { $_.Certificate } | Select-Object NotAfter, Subject |
新しい2023 CA証明書をDBやKEKに追加するタスクを実行
頭に sudo powershell とつけるか、管理者PowerShellにて動作させる。secure bootが有効じゃないとエラーが起きて先に進まない。イベントID 1800は要再起動の意味。イベントID一覧:UEFICA2023ErrorEvent 状態遷移:セキュア ブート証明書の展開のサポート
|
1 2 3 |
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Secureboot /v AvailableUpdates /t REG_DWORD /d 0x5944 /f Start-ScheduledTask -TaskName "\Microsoft\Windows\PI\Secure-Boot-Update" |
例えば以下のようにHKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\AvailableUpdatesの値を確認し、0x4100ならばリブートして再度タスク実行してを繰り返す
|
1 2 3 4 5 6 |
(Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot").AvailableUpdates | ForEach-Object { "0x{0:X}" -f $_ } 0x4100 ならばPCを再起動して再度 Start-ScheduledTask -TaskName "\Microsoft\Windows\PI\Secure-Boot-Update" 最大2回繰り返し。 |
雑ではなくてちゃんと証明書として扱って調べたい
以下はいったん証明書ファイルを出力させて確認する方法。.ps1スクリプト作るときはこれらの中間ファイルなんか作らずにesl-parser.ps1を参考にして好みに合わせて。
CA証明書一覧のUEFI変数をファイルにして真面目に調べたい
頭に sudo powershell とつけるか、管理者PowerShellにて
|
1 2 3 4 |
Get-SecureBootUEFI DB -OutputFilePath db.esl Get-SecureBootUEFI DBX -OutputFilePath dbx.esl Get-SecureBootUEFI KEK -OutputFilePath kek.esl Get-SecureBootUEFI PK -OutputFilePath pk.esl |
.eslを証明書ごとにばらかしたい(NSAの esl-parser.ps1 をどこぞにおいて)
|
1 2 3 4 |
powershell -ExecutionPolicy Bypass -File ...\esl-parser.ps1 db.esl db- powershell -ExecutionPolicy Bypass -File ...\esl-parser.ps1 dbx.esl dbx- powershell -ExecutionPolicy Bypass -File ...\esl-parser.ps1 kek.esl kek- powershell -ExecutionPolicy Bypass -File ...\esl-parser.ps1 pk.esl pk- |
などとすると db-0.cer, db-1.cer, db-2.cer, db-3.cer, db-4.cer, db-5.cer….. が出来上がります。
証明書のNotAfterとfingerprintとCNをみたい
|
1 |
Get-ChildItem -Filter "*.cer" | ForEach-Object {$c = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($_.FullName); $f=$_.Name; $c | Select-Object @{n="File";e={$f}}, NotAfter, Thumbprint, Subject } |
まじめにやるならば雑に文字列をぶっこ抜くのではなくて各証明書のfingerprintで特定します。
