仙石浩明の日記

2026年6月26日

第8世代PC でセキュアブートの証明書が更新されず Windows が起動しなくなったので、手作業で証明書を更新してみた

2026年6月以降、セキュアブートで用いられる証明書の有効期限が切れる

有効期限証明書
2026-06-24Microsoft Corporation KEK CA 2011
2026-06-27Microsoft UEFI CA 2011
2026-10-19Microsoft Windows Production PCA 2011

最近発売された新しい PC であれば、 自動的に証明書の更新が行われる。 今回有効期限が切れるのは 2011年の証明書で、 これが 2023年の証明書にアップデートされる。

ところが、 私の PC は中古で購入したものが多く、 発売後 5年以上経っているものばかりなので、 「Windows セキュリティ」アプリに警告マークが表示された。 [Windows セキュリティ] → [デバイス セキュリティ] → [セキュア ブート] に次のように表示される:

セキュア ブートはオンになっていますが、 デバイスは古いブート信頼構成を使用しており、 サービス可能な状態を維持するために更新する必要があります。

Dell製 PC の場合、 最新 BIOS であれば、 2023年の証明書を搭載している。 BIOS をアップデートした後、 アクティブDB を上書きすればよい。 実際、 OptiPlex 3080 SF, OptiPlex 3080 Micro (2020年 発売) や OptiPlex 3070 Micro (2019年 発売) では、 無事 2023年の証明書に更新され、 [Windows セキュリティ] → [デバイス セキュリティ] → [セキュア ブート] に次のように表示された:

セキュア ブートがオンになっており、 必要なすべての証明書の更新が適用されました。 これ以上の証明書の変更は必要ありません。

ところが、 OptiPlex 3060 SFOptiPlex 7060 Micro (いずれも 2018年発売) の BIOS は既にサポート外らしく、 バージョン 1.32.0 2024-09-03 が最終バージョンで、 これには 2023年の証明書が搭載されていない。

OptiPlex 3060 SF の場合、 最終バージョンの BIOS に搭載されているのは 2011年の証明書のままで、 前述したアクティブDB の上書き操作を行っても、 当然ながらアクティブDB は 2011年の証明書のままである。

OptiPlex 7060 Micro の場合はもっと悪く、 最終バージョンの BIOS にはセキュアブート証明書が搭載されていない。 アクティブDB の上書き操作を行うと Windows が起動しなくなってしまった。 もちろんセキュアブートを「Audit Mode」にすれば起動するが、 「Deployed Mode」だと起動画面に以下のように表示して止まってしまう:

Operating System Loader failed signature verification. WARNING: The file may have been tampered with!
Operating System Loader failed signature verification. WARNING: The file may have been tampered with!

All bootable devices failed Secure Boot verification.
Press F1 key to retry boot.
Press F2 key to reboot into setup.
Press F5 key to run onboard diagnostics.

当初、 OptiPlex 7060 がサポート外であることに気づかず、 OptiPlex 3080 や OptiPlex 3070 でセキュアブート証明書の更新がうまくいったのだから、 OptiPlex 7060 で Windows が起動できない (セキュアブートの検証が失敗する) のは Windows ブートローダの署名が (何らかのトラブルで) 壊れているからではないか? と疑ってしまった。

OptiPlex 7060 の EFIシステムパーティションから Windows のブートローダ bootmgfw.efi をコピーしてきて署名を調べてみる:

PS C:\Users\sengoku> (Get-AuthenticodeSignature .\bootmgfw.efi).SignerCertificate

Thumbprint                                Subject
----------                                -------
DC91E564D5BC1E3A8E02D6A8508682ABEA8A2443  CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US

ブートローダは問題無さそう。 もちろん、 ブートローダがきちんと署名されていても、 Windows 起動の途中で信頼の連鎖が途切れてしまっていて Windows が起動できないということは有り得るが、 とりあえず Windows 側はシロということにして OptiPlex 7060 側を疑ってみることにした。

では OptiPlex 7060 のアクティブDB はどうやって調べればいいのだろう? Dell の文書「セキュア ブート証明書を確認する方法」を見ると、 Get-SecureBootUEFI コマンドで、 アクティブDB の内容を見ることができるらしい。 ただしこのコマンドは DB のバイナリをそのまま出力するので、 テキストとして表示させると激しく文字化けする。 Gemini に相談したら、 次のプログラムを提示してくれた:

# dbバイナリの取得
$dbBytes = (Get-SecureBootUEFI -Name db).Bytes

# X.509証明書の開始位置(マジックナンバー: 30 82)を探索して切り出す
$certsCount = 0
for ($i = 0; $i -lt ($dbBytes.Length - 4); $i++) {
    # DER形式の一般的な証明書は「30 82」から始まる
    if ($dbBytes[$i] -eq 0x30 -and $dbBytes[$i+1] -eq 0x82) {
        # 長さの計算(簡易)
        $len = ($dbBytes[$i+2] * 256) + $dbBytes[$i+3] + 4
        if ($i + $len -le $dbBytes.Length) {
            $certsCount++
            $certBytes = $dbBytes[$i..($i + $len - 1)]
            
            # デスクトップに保存
            $outputPath = "$home\Desktop\extracted_db_cert_$certsCount.cer"
            [System.IO.File]::WriteAllBytes($outputPath, $certBytes)
            Write-Host "証明書 $certsCount を抽出しました: $outputPath" -ForegroundColor Green
        }
    }
}

このプログラムはアクティブDB のバイナリを読込んで、 証明書ごとに切り分けてデスクトップに書き出してくれる。 書き出された証明書を確認してみると…

驚いたことに以下の証明書しかなかった。 2022年6月11日に作ったダミーの証明書だろうか? こんな無意味な証明書を入れておくくらいなら、 OptiPlex 3060 SF のように古い 2011年のセキュアブート証明書を入れたままにしておいてくれたほうがいいのに。

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            7a:a0:fb:96:d7:3b:96:66:47:0f:e3:b2:b2:d1:54:6f:b7:a3:c2:0e
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=db
        Validity
            Not Before: Jun 11 11:22:42 2022 GMT
            Not After : Jun  6 11:22:42 2042 GMT
        Subject: CN=db
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    (省略)
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                DF:A9:4B:51:8E:03:57:B4:65:95:24:E6:90:71:D1:82:B8:28:12:F8
            X509v3 Authority Key Identifier: 
                DF:A9:4B:51:8E:03:57:B4:65:95:24:E6:90:71:D1:82:B8:28:12:F8
            X509v3 Basic Constraints: 
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
                    (省略)

というわけで、 問題の所在が OptiPlex 7060 側にあることが判明したので対策を考えてみる。 幸い OptiPlex シリーズ (に限らず大抵の PC ?) は、 セキュアブートに用いる証明書をカスタマイズできる。 具体的には BIOS 設定の 「Expert key Management」で PK, KEK, db, dbx 証明書を追加すればよい。

署名データベース (db および dbx)」から 2023年の証明書 「Windows UEFI CA 2023」と 「Microsoft UEFI CA 2023」をダウンロードし、 以下の手順で db.auth を作成する。

asao:~/wuefi $ openssl x509 -in 'windows uefi ca 2023.crt' -out win2023.pem -outform PEM
asao:~/wuefi $ cert-to-efi-sig-list -g "77fa9abd-0359-4d32-bd60-28f4e78f784b" win2023.pem win2023.esl
asao:~/wuefi $ openssl x509 -in 'microsoft uefi ca 2023.crt' -out ms2023.pem -outform PEM
asao:~/wuefi $ cert-to-efi-sig-list -g "77fa9abd-0359-4d32-bd60-28f4e78f784b" ms2023.pem ms2023.esl
asao:~/wuefi $ cat win2023.esl ms2023.esl ../secure_boot/db.esl > db.esl
asao:~/wuefi $ sign-efi-sig-list -k ../secure_boot/KEK.key -c ../secure_boot/KEK.crt db db.esl db.auth
Timestamp is 2026-6-24 23:55:16
Authentication Payload size 3838
Signature of size 1148
Signature at: 40

../secure_boot ディレクトリに、 私が使ってるキー登録キー (KEK) と、 Linux を起動するときに使っている署名データベース (db) を入れてある。 この db に 2023年の証明書をマージして、 KEK で署名して db.auth を作る。 これを OptiPlex 7060 に追加することで Windows をセキュアブートできるようになった。

[Windows セキュリティ] → [デバイス セキュリティ] → [セキュア ブート] に次のように表示される:

セキュア ブートはオンになっていますが、 ハードウェアまたはファームウェアの制限により、 デバイスはセキュア ブート証明書の自動更新をサポートしていません。 デバイスの製造元に問い合わせてください。

「セキュア ブート証明書の自動更新をサポート」するには、 2023年のキー登録キー (KEK) が必要。 「Microsoft Corporation KEK 2K CA 2023」をダウンロードし、 私が使ってる KEK にマージする:

asao:~/wuefi $ openssl x509 -in 'microsoft corporation kek 2k ca 2023.crt' -out ms2023kek.pem -outform PEM
asao:~/wuefi $ cert-to-efi-sig-list -g "77fa9abd-0359-4d32-bd60-28f4e78f784b" ms2023kek.pem ms2023kek.esl 
asao:~/wuefi $ cat ms2023kek.esl ../secure_boot/KEK.esl > KEK.esl
asao:~/wuefi $ sign-efi-sig-list -k ../secure_boot/PK.key -c ../secure_boot/PK.crt KEK KEK.esl KEK.auth
Timestamp is 2026-6-25 00:13:01
Authentication Payload size 2358
Signature of size 1145
Signature at: 40

../secure_boot ディレクトリに、 私が使ってるプラットフォーム キー (PK) を入れてある。 マージした KEK を PK で署名して KEK.auth を作る。 これを OptiPlex 7060 に追加することで、 セキュア ブート証明書の自動更新もサポートすることができるようになった。

Filed under: システム構築・運用 — hiroaki_sengoku @ 19:26

No Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment