2026年6月以降、セキュアブートで用いられる証明書の有効期限が切れる。
| 有効期限 | 証明書 |
|---|---|
| 2026-06-24 | Microsoft Corporation KEK CA 2011 |
| 2026-06-27 | Microsoft UEFI CA 2011 |
| 2026-10-19 | Microsoft 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 SF や OptiPlex 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 に追加することで、 セキュア ブート証明書の自動更新もサポートすることができるようになった。