MS UEFI関連証明書確認コマンド

仕組みはわかっとるしスクリプト流したいんじゃなくてシンプルに現状の確認をするワンライナーだけコピペしたいんじゃ、Windowsですませたいんじゃ。というときのコマンド集

管理者PowerShellにて動作させるか、各コマンド前にsudo powershellとつける。パイプや;を使ってる場合は後者はめんどう。CUIのウィンドウの横幅は思いっきり広げて文字を小さめにして。

DBやKEKに新しい証明書(2023)があるか雑に確認したい

それぞれTrueならば存在している。精確に見たい場合は後述。secure bootが無効になっている場合はGet-SecureBootUEFIがこける。

DBやKEKに期限が切れる証明書があるか雑に確認したい

それぞれTrueならば存在している。DBやKEKであればあったからどうということもなく。精確に見たい場合は後述

雑ではなくてちゃんと証明書として扱って調べたい

まじめにやるならば雑に文字列をぶっこ抜くのではなくて各証明書などの元ネタや確かな情報のfingerprintで特定します。以降はUEFI変数から証明書ファイルを出力させるなどの方法で確認する方法です。.ps1スクリプト作るときは中間ファイルなんか作らずにesl-parser.ps1を参考にして好みに合わせて。

TBSハッシュの算出がワンライナーにするには長すぎるので、以降あらかじめ一度だけこれ全体をタイトル行のコピーボタンでコピペして実行しておきます。

ブートマネージャ(.efi)が2023証明書で署名されているかを確認すべくNotAfter,fingerprint,Subjectを表示する

後述のタスクが実行されていくことで上のコマンドでレジストリを確認して WindowsUEFICA2023Capable が2であれば「すでに2023で署名されたboot managerで起動している」だそうです。なんにせよ実際の署名を確認します。

EFIがあるパーティション(ESP)は「ディスクの管理(diskmgmt.msc)」のボリューム列などでディスク番号とパーティション番号を調べて、Harddisk0やPartition1の数字部分をその数字に変更。Windowsのブートマネージャ以外はEFI\以降のフォルダ、ファイル名を変える。

このissueの説明のおかげembedded署名を取得してます。まだであれば一度Get-CertFingerprints関数などをコピペで実行して登録しておき

実行例

この例では1行目で少なくとも近々また署名しなおしたものに置き換わりそうなことがわかり、その次が確かにCN=Windows UEFI CA 2023でfingerprintもMS Secure Boot Objectsから算出したものと同じでした。

余談ですが単にGet-AuthenticodeSignatureをするとカタログ署名がとれてしまうのだそうな。

実行例

ブートマネージャ(.efi)のPE Image Hashを計算したい

Windows Authenticode Portable Executable Signature Format 直docxのp.15を見てやり始めるものの車輪の再開発に無限の時間がかかりそうなので日和ります。ググるとSysinternalsのSigcheckを使うのが早そうなのでWinGetでインストールしてしまいます。

使ってみます。前述のようにHarddisk0やPartition1の数字はよきに変更。

実行例(DBXに証明書ではなく.efiで登録される場合はPE256の値で登録される/されているはず)

CA証明書一覧のUEFI変数をファイルにして真面目に調べたい

.eslを証明書ごとにばらかしたい

NSAの esl-parser.ps1 をどこぞにおいて

などとすると db-0.cer, db-1.cer, db-2.cer, db-3.cer, db-4.cer, db-5.cer….. や dbx-0.hsh, dbx-2.hsh, dbx-3.hsh, dbx-4.hsh, dbx-5.hsh….. が出来上がります。

ただし esl-parser.ps1は EFI_SIGNATURE_DATA をあわせて見るとわかるように、161(0xa1) で EFI_CERT_X509_GUID { 0xa5c059a1, 0x94e4, 0x4aa7, { 0x87, 0xb5, 0xab, 0x15, 0x5c, 0x2b, 0xf0, 0x72 } } そして 38(0x26)で EFI_CERT_SHA256_GUID { 0xc1c41626, 0x504c, 0x4092, { 0xac, 0xa9, 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28 } } をひっかけているだけである一方、 仕様側は EFI_CERT_SHA512_GUID などのPE Imageハッシュや証明書TBSハッシュの別アルゴリズムなどのタイプも存在しているので、実在しているかは知りませんがDBXに存在しているかどうかのチェックは特に esl-parser.ps1 でエラーが表示された場合はタイプに合わせていろいろ改造する必要があります

DBXには証明書本体が格納されずにfingerprintだけの場合(TBSハッシュ)もあり得るので、DB や KEK と同様な雑な文字列チェックでは「存在しない」という誤った結果になってしまうかもしれません。MSは証明書を無効にする場合はわかりやすいように証明書本体を登録するのだと思いますが…

証明書ファイルのNotAfterとfingerprintとCNをみたい

まだであれば一度Get-CertFingerprints関数などをコピペで実行して登録しておき

実行例

同様にMS Secure Boot Objectsにある証明書ファイルのfingerprintを表示させたい

実行例(fingerprintはこのページのような情報をそのままうのみにすることなく、自力で公式サイトの一次情報から算出する)

さらに証明書チェーンでNotAfterとfingerprintとCNをみたい

実行例

.hsh(SHA-256 fingerprint)を人が読めるようにしたい

実行例(DBXなのでblock listの表示) タイプがわかるように esl-parser.ps1 を改造してもよいかも。

新しい証明書(2023)をDBやKEKに追加するタスクを実行

管理者PowerShellにて動作させる。secure bootが有効じゃないとエラーが起きて先に進まない。イベントID 1800は要再起動の意味。イベントID一覧:UEFICA2023ErrorEvent 状態遷移:セキュア ブート証明書の展開のサポート

例えば以下のようにエラーやステータスを確認して必要に応じて再起動する。イベントID: 1800は要再起動の意

AvailableUpdateが0x4100の時は再起動して再度タスクを実行。

WindowsUEFICA2023Capableが2であれば「すでに2023で署名されたboot managerで起動している」だそうです。前出のとおりにembedded署名のチェーンで確認してください。

記念に今ESPにある.efiのPE256を出力させてみます。前述のようにHarddisk0やPartition1の数字はよきに変更。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です