動簽名報錯?用自簽名證書+測試簽名模式徹底解決)
如果你搞過嵌入式開發(fā)、單片機調(diào)試或者給老外設(shè)裝驅(qū)動一定遇到過這個彈窗Windows提示“無法驗證此驅(qū)動程序軟件的發(fā)布者”然后直接不給裝。網(wǎng)上搜一圈答案基本是“開機按F8禁用驅(qū)動簽名強制”或者“bcdedit關(guān)掉驅(qū)動簽名”但這類方案在現(xiàn)在的Windows 10/11上越來越不好用——尤其是開了Secure Boot的機器這一套已經(jīng)徹底失效了。這篇文章想聊的是另一條路不需要禁用驅(qū)動簽名而是反過來主動給驅(qū)動補上一個“簽名”讓系統(tǒng)認為它是可信的。這套方法適用于驅(qū)動沒有通過WHQL認證、又必須在64位系統(tǒng)上正常安裝的場景比如J-Link、ST-Link、CH340、CP2102這些開發(fā)調(diào)試工具的驅(qū)動或者企業(yè)內(nèi)部自研硬件的內(nèi)網(wǎng)驅(qū)動部署。1. 驅(qū)動簽名的門檻為什么你的驅(qū)動老是被Windows攔下來要繞過這堵墻首先得知道墻是怎么砌起來的。Windows從Vista的64位版本開始強制要求所有加載到內(nèi)核模式的驅(qū)動程序必須帶有有效的數(shù)字簽名。這不是某個安全軟件的策略而是操作系統(tǒng)內(nèi)核級別的硬性規(guī)定。1.1 內(nèi)核模式的強制簽名要求所謂“內(nèi)核模式”你可以把它理解成操作系統(tǒng)最核心的權(quán)限層。普通應(yīng)用程序運行在用戶模式出問題頂多自己崩潰但驅(qū)動運行在內(nèi)核模式一旦出錯就是藍屏更糟糕的是如果被惡意驅(qū)動注入整個系統(tǒng)的安全性就直接淪陷了。所以微軟制定了一條規(guī)則64位系統(tǒng)上驅(qū)動文件.sys必須經(jīng)過簽名驗證才能被加載。驗證通過的數(shù)字簽名本質(zhì)上是對驅(qū)動文件內(nèi)容做了一次Hash計算再用簽名者的私鑰加密系統(tǒng)加載驅(qū)動時用公鑰反向解密比對確定文件沒有被篡改、來源可追溯。這個機制本身沒有太大問題真正的問題是它把門檻抬高了。1.2 WHQL認證的現(xiàn)實成本不是每家廠商都愿意花這筆錢正常獲取微軟簽名的路徑是通過WHQL認證Windows Hardware Quality Labs廠商需要把硬件和驅(qū)動提交給微軟測試通過了才能拿到微軟的官方簽名。這個過程耗時短則一兩周、長則一兩個月而且需要繳納認證費用。對于大廠來說這個成本不算什么但問題恰恰出在小廠商和開源硬件項目上。CH340這種十幾塊錢的USB轉(zhuǎn)串口芯片利潤本來就不高廠商會去交幾千美元的WHQL認證費嗎J-Link的盜版克隆版滿天飛原廠SEGGER只給正版驅(qū)動做簽名那些幾十塊錢的克隆仿真器當然不會被官方認可。ST-Link、CP2102也基本都是這個情況。這就是Windows驅(qū)動安裝界最常見的尷尬設(shè)備本身沒有任何問題驅(qū)動代碼運行得好好的裝不上純粹是因為沒有那張“簽名證書”。1.3 簽名驗證的三種狀態(tài)搞清楚系統(tǒng)在什么情況下會攔截比盲目操作更重要。Windows驗證驅(qū)動簽名時結(jié)果無非三種狀態(tài)表現(xiàn)系統(tǒng)處理方式簽名有效且受信任驅(qū)動正常安裝無任何提示直接放行簽名有效但不受信任提示“無法驗證發(fā)布者”但在高級選項中可以強制安裝彈出警告允許用戶手動強制簽名無效或未簽名直接拒絕加載提示“哈希值不在目錄文件中”或類似的嚴重錯誤徹底攔截無法通過常規(guī)方式安裝第一種情況對應(yīng)的就是WHQL認證驅(qū)動或者你已經(jīng)把證書安裝到系統(tǒng)受信任存儲中的情況。第二種情況是很多自簽名驅(qū)動的典型表現(xiàn)——簽名本身是有效的但系統(tǒng)不認這個簽名者。只有第三種是真正意義上的“簽名無效”。這篇文章要解決的核心問題就是把第二種狀態(tài)轉(zhuǎn)化為第一種狀態(tài)讓系統(tǒng)信任一個我們自己創(chuàng)建的簽名證書。2. 傳統(tǒng)“禁用簽名”方案的兩個硬傷在進入正題之前先把舊方案為什么不推薦講清楚。不是說禁用驅(qū)動簽名這條路完全走不通而是它有兩個在當前環(huán)境下越來越難回避的問題。2.1 安全風險關(guān)閉DSE等于把大門敞開驅(qū)動簽名強制Driver Signature EnforcementDSE不是擺設(shè)。在64位系統(tǒng)上要關(guān)閉這個機制你必須通過高級啟動菜單里的“禁用驅(qū)動程序強制簽名”選項或者用bcdedit修改引導(dǎo)配置。前者是一次性的——重啟后自動恢復(fù)后者是永久性的——修改了系統(tǒng)的全局安全策略。在后一種情況下整個系統(tǒng)的內(nèi)核防護等于降級了。任何沒有簽名的驅(qū)動——注意是任何包括惡意軟件利用漏洞釋放出來的驅(qū)動——都可以被加載到內(nèi)核模式。內(nèi)核是系統(tǒng)的最后一道防線這道防線卸了殺毒軟件再強也攔不住針對底層的攻擊。我給客戶做企業(yè)內(nèi)網(wǎng)方案的時候從來不會建議他們用關(guān)DSE的方式解決驅(qū)動安裝問題原因很簡單你每關(guān)一次等于讓內(nèi)網(wǎng)所有機器的安全等級回到XP時代合規(guī)檢查的時候這就是一條嚴重漏洞。2.2 Secure Boot沖突Win11時代的新問題第二個問題更現(xiàn)實Win11強制要求開啟Secure Boot在這類機器上bcdedit那套修改引導(dǎo)配置的操作會直接報錯。Secure Boot的機制是UEFI固件只信任特定證書簽名的引導(dǎo)加載程序。微軟的引導(dǎo)加載程序只加載那些簽名狀態(tài)“健康”的Windows系統(tǒng)配置。當你試圖用bcdedit修改內(nèi)核模式代碼簽名策略時Secure Boot會拒絕執(zhí)行因為你改動的正是它要保護的那一層。我之前在ThinkPad X1 CarbonWin11預(yù)裝上測試過這條老路實測效果就是命令執(zhí)行完畢提示成功但重啟后完全沒有任何變化右下角依然沒有“測試模式”水印驅(qū)動依然裝不上。原因就是Secure Boot在固件層面攔截了引導(dǎo)配置的修改。2.3 三種方案的橫向?qū)Ρ确桨赴踩约嫒菪猿志眯赃m用場景禁用驅(qū)動簽名F8方式差但僅限本次啟動Win11 Secure Boot失效一次性臨時安裝驅(qū)動后重啟失效禁用驅(qū)動簽名bcdedit永久極差內(nèi)核防線全開Win11 Secure Boot失效永久不建議任何場景使用自簽名測試簽名模式較高僅信任指定證書全兼容含Secure Boot永久證書有效期內(nèi)企業(yè)內(nèi)網(wǎng)、開發(fā)調(diào)試場景從表格可以看出自簽名方案不是“繞過”安全機制而是“替換信任對象”——系統(tǒng)依然強制驗證簽名只是驗證通過的對象從“微軟簽發(fā)的證書”變成了“你自己創(chuàng)建的證書”。3. 自簽名方案的核心思路讓系統(tǒng)自己認“自己人”搞定了“為什么”接下來講“怎么做”。自簽名方案的核心邏輯可以概括成一句話把信任鏈的源頭換成你自己。3.1 信任鏈的傳導(dǎo)邏輯Windows系統(tǒng)驗證驅(qū)動簽名時并不是只檢查驅(qū)動文件上的簽名本身而是要順著證書鏈一路往上看簽名這張證書是誰簽發(fā)的簽發(fā)這張證書的上層證書又是否在系統(tǒng)的受信任根證書列表中微軟WHQL簽名證書的信任鏈大概是這樣的微軟根證書在系統(tǒng)受信任根列表中 └── 微軟WHQL中間證書 └── 驅(qū)動文件上的數(shù)字簽名這個鏈條的頂端“微軟根證書”裝在每一臺Windows系統(tǒng)里所以微軟簽發(fā)的驅(qū)動天然被信任。自簽名方案的邏輯是我們自己創(chuàng)建一張根證書把它安裝到系統(tǒng)的“受信任的根證書頒發(fā)機構(gòu)”存儲區(qū)然后用這張根的私鑰去簽發(fā)驅(qū)動簽名證書。這樣信任鏈就變成我們自己的根證書已安裝到受信任根列表 └── 驅(qū)動文件上的數(shù)字簽名直接用根證書簽名或中間證書簽名系統(tǒng)在驗證驅(qū)動簽名時往上追溯發(fā)現(xiàn)頂端證書在受信任根列表里就會認定這條信任鏈有效。3.2 測試簽名模式Test Signing是什么、為什么需要有了受信任的根證書還差最后一步Windows對內(nèi)核模式驅(qū)動有一個額外限制——默認情況下即使簽名鏈有效系統(tǒng)也只加載“經(jīng)過了WHQL認證流程”的簽名驅(qū)動。要打破這個限制需要開啟“測試簽名模式”。這里有個關(guān)鍵點必須澄清測試簽名模式不等于禁用驅(qū)動簽名。它是一個獨立的開關(guān)作用是允許加載帶有“測試簽名”的內(nèi)核驅(qū)動。測試簽名和正式簽名的區(qū)別在于證書的Enhanced Key Usage增強型密鑰用法字段里多了一個代碼簽名用途標識。開啟測試簽名模式后系統(tǒng)右下角會出現(xiàn)“測試模式”水印這是正常的關(guān)掉開關(guān)后水印會消失。需要注意的是測試簽名模式要發(fā)揮作用必須滿足兩個前提——第一系統(tǒng)的Secure Boot處于關(guān)閉狀態(tài)但Win11強制開啟Secure Boot這個問題后面會說解法第二驅(qū)動文件的簽名鏈必須完整且受信任。3.3 準備工作安裝Windows SDK / WDK拿齊工具鏈正式操作之前先把工具備齊。核心工具是三個工具作用來源makecert / New-SelfSignedCertificate生成證書前者在WDK中后者是PowerShell內(nèi)置命令signtool給驅(qū)動文件簽名Windows SDK / WDKcertmgr.msc / certutil管理證書存儲區(qū)系統(tǒng)自帶最簡單的方式是直接安裝Windows SDK在安裝向?qū)е泄催x“Windows SDK for Desktop Apps”組件即可。安裝完成后signtool的路徑通常在C:\Program Files (x86)\Windows Kits\10\bin\10.0.xxxxx.0\x64\signtool.exe注意確保使用x64版本的signtool因為你要簽名的驅(qū)動是64位的內(nèi)核模塊。如果只想快速測試、不想安裝完整的SDK也可以用PowerShell的New-SelfSignedCertificate直接生成證書然后用早期版本的signtool或者Visual Studio自帶的環(huán)境。4. 實操第一步生成自簽名證書并導(dǎo)入受信任存儲工具就位后正式開始。4.1 生成證書的兩種途徑老派makecert與新派PowerShell老一代工程師習慣用makecert但這個工具在新版WDK里已經(jīng)標記為過時。我更推薦用PowerShell的New-SelfSignedCertificate命令更簡潔參數(shù)也更語義化。打開一個管理員權(quán)限的PowerShell窗口執(zhí)行下面的命令New-SelfSignedCertificate -Subject CNMy Company Internal Driver Signing Root -FriendlyName My Company Internal Driver Signing Root -KeyAlgorithm RSA -KeyLength 2048 -KeyExportPolicy Exportable -CertStoreLocation Cert:\CurrentUser\My -NotAfter (Get-Date).AddYears(10)幾個參數(shù)的關(guān)鍵含義-Subject證書的主體名稱會顯示在系統(tǒng)信任列表中。建議用公司或者組織名稱方便識別。-KeyExportPolicy Exportable必須設(shè)置為可導(dǎo)出因為后面要用私鑰導(dǎo)出為.pfx文件供signtool簽名使用。如果這一步漏了后面parsing私鑰時會報錯。-CertStoreLocation這里存到當前用戶的個人證書存儲區(qū)方便后續(xù)導(dǎo)出。注意不要直接存到Root區(qū)后面有專門的導(dǎo)入步驟。-NotAfter證書有效期企業(yè)內(nèi)網(wǎng)建議設(shè)置為5-10年省去頻繁續(xù)期的麻煩。命令執(zhí)行成功后會返回一個指紋Thumbprint值記下來后面導(dǎo)出證書要用。如果是在Server環(huán)境的PowerShell里執(zhí)行可能需要先確認一下當前PowerShell版本。New-SelfSignedCertificate在Windows 10/Windows Server 2016以上的系統(tǒng)里都是內(nèi)置可用的。4.2 導(dǎo)出證書文件一個.cer一個.pfx生成的證書包含了公鑰和私鑰需要拆成兩份文件.cer只含公鑰用于安裝到其他電腦的受信任根存儲。.pfx包含公鑰私鑰用于signtool簽名操作。導(dǎo)出用PowerShell命令# 假設(shè)指紋是ABC123DEF456GHI789JKL012MNO345PQR678STU $cert Get-ChildItem -Path Cert:\CurrentUser\My\ABC123DEF456GHI789JKL012MNO345PQR678STU # 導(dǎo)出.cer公鑰證書 Export-Certificate -Cert $cert -FilePath C:\Drivers\MyRoot.cer # 導(dǎo)出.pfx帶私鑰會提示設(shè)置密碼 Export-PfxCertificate -Cert $cert -FilePath C:\Drivers\MyRoot.pfx -Password (ConvertTo-SecureString YourPfxPassword -AsPlainText -Force)這里有個經(jīng)驗Pfx密碼設(shè)一個簡單好記的但別設(shè)太弱因為這個文件一旦泄露別人就能用你的證書給任意驅(qū)動簽名——等于擁有了讓全網(wǎng)機器信任你的能力安全性等同于私鑰本身。4.3 導(dǎo)入證書到Root與TrustedPublisher存儲區(qū)接下來把.cer證書安裝到本機的受信任根證書存儲區(qū)。有兩種方式方式一圖形界面雙擊MyRoot.cer文件點擊“安裝證書”存儲位置選擇“本地計算機”在“證書存儲”頁面選擇“將所有證書放入下列存儲”點擊“瀏覽”選擇“受信任的根證書頒發(fā)機構(gòu)”完成導(dǎo)入方式二命令行推薦便于內(nèi)網(wǎng)批量部署certutil -addstore Root C:\Drivers\MyRoot.cer這個命令會把證書導(dǎo)入到本地計算機的受信任根證書頒發(fā)機構(gòu)存儲。注意如果當前用戶不是管理員certutil操作會失敗務(wù)必用管理員命令行執(zhí)行。另外為了讓后面的簽名驗證更順暢建議把證書同時導(dǎo)入到“受信任的發(fā)布者”TrustedPublisher存儲區(qū)certutil -addstore TrustedPublisher C:\Drivers\MyRoot.cer這一步雖然不是必需的但在某些Windows版本上能減少彈窗提示。驗證是否導(dǎo)入成功運行certmgr.msc打開“受信任的根證書頒發(fā)機構(gòu)” - “證書”應(yīng)該能看到剛才創(chuàng)建的名稱。這一步確認不了就有問題了后面就算簽名成功系統(tǒng)也不會認。5. 實操第二步用signtool完成驅(qū)動簽名證書就緒后接下來處理驅(qū)動文件。5.1 先搞清楚要簽?zāi)膫€文件.sys還是.cat一個驅(qū)動包里通常有好幾個文件最常見的是.inf安裝信息、.sys驅(qū)動主體、.cat目錄文件包含驅(qū)動文件的哈希值。簽名時只需要對.cat目錄文件簽名就夠了。因為Windows安裝驅(qū)動時驗證的是目錄文件里哈希值和簽名是否匹配而.inf和.sys本身的內(nèi)容已經(jīng)被哈希匯總到.cat文件里了。如果你的驅(qū)動包里沒有.cat文件那就直接對.sys文件簽名。對.sys簽名更簡單但缺點是這個.sys文件后續(xù)被壓縮或者修改過就會失效。實操中我的習慣有.cat就簽.cat沒有就簽.sys。兩條命令都要會。5.2 signtool核心命令詳解先簽.cat文件signtool sign /f C:\Drivers\MyRoot.pfx /p YourPfxPassword /fd SHA256 /t http://timestamp.digicert.com /v C:\Drivers\driver\mydriver.cat再簽.sys文件signtool sign /f C:\Drivers\MyRoot.pfx /p YourPfxPassword /fd SHA256 /t http://timestamp.digicert.com /v C:\Drivers\driver\mydriver.sys每個參數(shù)的含義參數(shù)作用補充說明/f指定私鑰證書文件即前面導(dǎo)出的.pfx文件路徑/p指定.pfx密碼注意不要和系統(tǒng)登錄密碼混淆/fd SHA256指定哈希算法現(xiàn)在必須用SHA256SHA1在很多新系統(tǒng)上不再信任/t指定時間戳服務(wù)器讓簽名在證書過期后依然有效強烈建議加上/v輸出詳細日志簽名失敗時排查錯誤信息全靠這個參數(shù)重點說下/t時間戳參數(shù)。簽名的本質(zhì)是一個時間點上的“認證”證書本身有有效期如果在證書有效期內(nèi)簽名系統(tǒng)會認為簽名有效但證書一旦過期簽名也會跟著失效。加上時間戳后簽名時間會被存證即使證書過期簽名依然有效。時間戳服務(wù)器選哪個我用過的有幾個時間戳服務(wù)器地址可用性個人體感http://timestamp.digicert.com穩(wěn)定首選http://timestamp.comodoca.com偶爾超時備選http://sha256timestamp.ws.symantec.com部分網(wǎng)絡(luò)不通不推薦國內(nèi)網(wǎng)絡(luò)環(huán)境訪問DigiCert的時間戳服務(wù)器偶爾會有超時多試幾次或者換個時間再簽一般能成功。如果實在連不上也可以用/tr參數(shù)做RFC3161時間戳但兼容性稍差。簽名成功后會輸出類似“Done Adding Additional Store”和“Successfully signed: ...\mydriver.cat”的提示。5.3 驗證簽名是否生效簽名完成后強烈建議先驗證一下不要直接跑去裝驅(qū)動。signtool verify /pa /v C:\Drivers\driver\mydriver.cat/pa參數(shù)的作用是驗證簽名是否符合Windows硬件驅(qū)動程序驗證策略包括受信任根檢查和簽名鏈檢查。如果輸出中有“Verified: ...”說明簽名有效且證書鏈完整。如果輸出中有錯誤最常見的是“找不到證書鏈”Cert not found或者“證書鏈已處理但終止于不受信任的根”這時候先別急著裝驅(qū)動回頭檢查證書導(dǎo)入那一步是否操作到位。經(jīng)驗之談簽名驗證不通過九成是證書沒正確導(dǎo)入到Root存儲不是簽名本身的問題。先跑一下certutil -addstore Root C:\Drivers\MyRoot.cer再重新驗證基本能解決。6. 實操第三步開啟測試簽名模式并完成安裝簽名完畢還差最后一道工序讓系統(tǒng)允許加載這個帶有自簽名的內(nèi)核驅(qū)動。6.1 bcdedit開啟Test Signing用管理員命令行執(zhí)行bcdedit /set testsigning on執(zhí)行成功后重啟電腦。重啟后桌面右下角會出現(xiàn)“測試模式 內(nèi)部版本xxxx”的水印這是正常現(xiàn)象表示系統(tǒng)現(xiàn)在允許加載測試簽名的驅(qū)動。順帶一提這個水印雖然不影響功能但有些人不喜歡。如果是在正式內(nèi)網(wǎng)環(huán)境部署可以選擇不開啟testsigning而是直接利用“禁用驅(qū)動程序強制簽名”菜單做一次性的安裝——不過這是妥協(xié)方案不推薦。在Win11 Secure Boot的機器上執(zhí)行這條命令會失敗。報錯信息一般是“無法打開啟動配置數(shù)據(jù)存儲。拒絕訪問。”或者“該命令要求啟用的Windows操作系統(tǒng)正在運行中”。這并不是權(quán)限問題而是Secure Boot在固件層面阻止了引導(dǎo)配置修改。那Win11怎么處理有個騷操作是暫時關(guān)掉Secure Boot開啟testsigning重啟后再打開Secure Boot。實測下來這個辦法有效因為testsigning狀態(tài)已經(jīng)寫入了引導(dǎo)配置Secure Boot開啟后會校驗引導(dǎo)配置的完整性——這就涉及到一個矛盾點后文會展開說。6.2 安裝驅(qū)動后的驗證流程開啟測試簽名模式并重啟后再去設(shè)備管理器里安裝驅(qū)動。具體步驟右鍵點擊設(shè)備管理器里有黃色感嘆號的設(shè)備選擇“更新驅(qū)動程序”選擇“瀏覽我的電腦以查找驅(qū)動程序”指向驅(qū)動所在目錄系統(tǒng)如果識別到簽名證書會彈出“Windows安全”對話框詢問是否安裝驅(qū)動程序點擊“安裝”驅(qū)動應(yīng)該會正常安裝成功如果一切順利設(shè)備管理器里黃色感嘆號會消失。如果還是失敗看現(xiàn)象失敗現(xiàn)象原因排查提示“發(fā)布者無法驗證”證書未正確導(dǎo)入Root存儲或testsigning未開啟提示“數(shù)字簽名被移除”.sys被修改過簽名與內(nèi)容不匹配重新簽名提示“哈希值不在目錄文件”.cat文件和.inf文件不匹配統(tǒng)一重新簽名沒有彈窗但安裝失敗檢查驅(qū)動代碼本身是否有問題或者.inf文件是否損壞6.3 關(guān)閉測試簽名模式驅(qū)動安裝完成后可以關(guān)閉測試簽名模式bcdedit /set testsigning off重啟后右下角水印消失系統(tǒng)恢復(fù)正常狀態(tài)。已安裝的驅(qū)動不受影響——這是很多人的疑問實測下來關(guān)閉testsigning不影響已經(jīng)成功安裝的驅(qū)動加載因為驅(qū)動的簽名已經(jīng)通過了驗證并寫入了系統(tǒng)的驅(qū)動存儲區(qū)。所以完整流程是開啟testsigning - 安裝驅(qū)動 - 關(guān)閉testsigning - 正常使用。這樣既完成了驅(qū)動安裝又不需要長期保持在測試簽名模式。不過如果你還要繼續(xù)調(diào)試其他驅(qū)動建議暫時不關(guān)等一批驅(qū)動都裝完再一次性關(guān)閉省得來回重啟。7. 實操中容易踩的坑與排查思路這部分內(nèi)容不是從文檔里抄的是這幾年做企業(yè)內(nèi)網(wǎng)驅(qū)動部署實打?qū)嵅瘸鰜淼摹?.1 時間戳服務(wù)器連不上簽名“過期”的隱形炸彈第一次做簽名時我跳過了/t參數(shù)只簽了名沒打時間戳。當時驅(qū)動能正常裝但一年后證書到期所有機器上的這個驅(qū)動突然裝上就藍屏重新安裝直接拒絕加載“簽名無效”。原因就是沒打時間戳的簽名在證書過期后會被系統(tǒng)判定為“簽名已過期”。時間戳相當于給簽名行為“存檔”了一個時間點以后驗證時系統(tǒng)認為簽名在那個時間點有效而不是在驗證的當下再查證書有效期。教訓簽名時不加/t參數(shù)省了一時的事后面坑到自己。針對企業(yè)內(nèi)網(wǎng)這種要長期使用的場景時間戳一定不能省。7.2 Secure Boot開啟時testsigning失效的處理這是Win11時代最讓人抓的地方。前面說過Win11強制Secure Boot而testsigning命令在Secure Boot開啟時會被拒絕。我一開始也卡在這里后來自己反復(fù)測試摸出了一條相對穩(wěn)定的路進入主板BIOS/UEFI設(shè)置暫時關(guān)閉Secure Boot以管理員身份執(zhí)行bcdedit /set testsigning on重啟進入系統(tǒng)確認右下角出現(xiàn)測試模式水印安裝驅(qū)動驗證成功后關(guān)閉電源再進BIOS重新打開Secure Boot正常啟動驅(qū)動保持可用這套流程實測在Dell和Lenovo的Win11機型上都可行。原理是testsigning的引導(dǎo)配置在Secure Boot開啟后不會被清除但新的修改會被阻止。既然配置已經(jīng)寫進去了重新開啟Secure Boot也不會回滾這個狀態(tài)。但這里有個反直覺的地方有的機器重新開啟Secure Boot后啟動時會報錯“無法驗證簽名”或者直接進入BitLocker恢復(fù)模式。遇到這種情況建議操作前先臨時掛起B(yǎng)itLocker保護manage-bde -protectors -disable C:等操作完再恢復(fù)。7.3 企業(yè)內(nèi)網(wǎng)批量部署怎么把證書分發(fā)下去自簽名方案在個人開發(fā)機上很好用到了企業(yè)內(nèi)網(wǎng)批量部署就有新問題幾十臺甚至上百臺機器總不能每臺都手動雙擊安裝證書。兩條路路徑一組策略GPO分發(fā)把.cer證書放到網(wǎng)絡(luò)共享路徑在AD域控制器的組策略管理編輯器里創(chuàng)建新GPO并配置計算機配置 - Windows設(shè)置 - 安全設(shè)置 - 公鑰策略 - 受信任的根證書頒發(fā)機構(gòu)選擇“導(dǎo)入”指定.cer文件路徑域內(nèi)客戶端下一次組策略刷新時gpupdate /force會自動導(dǎo)入證書。實測下來的注意點導(dǎo)入根證書時GPO操作偶爾會因“證書已存在”報錯。處理方法是在應(yīng)用策略前先統(tǒng)一清理舊證書。路徑二腳本批量安裝針對非域環(huán)境可以用啟動腳本或登錄腳本來做certutil -addstore Root \\fileserver\share\MyRoot.cer certutil -addstore TrustedPublisher \\fileserver\share\MyRoot.cer把腳本做成批處理放到客戶端的啟動項或者通過遠程運維工具推送執(zhí)行比逐臺手動點按證書安裝窗口高效得多。另外提醒一句企業(yè)內(nèi)網(wǎng)部署時證書的私鑰.pfx應(yīng)該只保存在簽名機上不要分發(fā)到各終端。各終端只需要公鑰證書.cer不需要私鑰。7.4 驅(qū)動文件是多個INF引用與.cat的坑部分驅(qū)動包里不止一個.sys文件inf文件也聲明了多個文件條目。這種情況下對單個.sys簽名不夠必須對所有相關(guān)文件打一個統(tǒng)一的.cat目錄文件再對.cat簽名。制作.cat目錄文件的有兩種常用方式使用WDK自帶的Inf2Cat工具Inf2Cat /driver:C:\Drivers\driver /os:10_X64這個命令會讀取.inf文件里的文件清單生成對應(yīng)的.cat文件。前提是.inf文件中的[Version]段有CatalogFile聲明。手動創(chuàng)建.cat文件不適合復(fù)雜驅(qū)動建議直接用Inf2Cat。生成.cat后再對這個.cat執(zhí)行signtool簽名安裝時系統(tǒng)會通過.inf的CatalogFile字段自動找到并驗證.cat。實際項目中我遇到過這種情況驅(qū)動裝不上設(shè)備管理器提示“哈希值不在目錄文件中”查了一圈發(fā)現(xiàn)是Inf2Cat生成.cat前.inf文件里沒聲明CatalogFile字段。加上后再生成問題解決。這種細節(jié)挺隱蔽的如果只簽.sys不簽.cat而.inf又是通過.cat引用的就會出現(xiàn)簽名“看起來成功但實際沒生效”的假象。7.5 簽名后驅(qū)動仍然報“無法驗證”的終極排查思路把排查流程串一遍供遇到問題的朋友對照第一步確認證書是否在受信任根證書存儲區(qū)里。運行certmgr.msc查看“受信任的根證書頒發(fā)機構(gòu) - 證書”里是否有你的證書。沒有的話直接certutil -addstore Root xxx.cer。第二步確認簽名是否有效。運行signtool verify /pa /v 驅(qū)動文件看輸出是否有“Verified”字樣。有報錯就按報錯提示處理比如找不到證書鏈就檢查時間戳。第三步確認系統(tǒng)testsigning是否開啟。運行bcdedit /enum | findstr testsigning如果值為Yes說明已開啟值為No則說明沒開。第四步確認.inf是否正確引用.cat和簽名。用文本編輯器打開.inf文件檢查[Version]段的CatalogFile字段是否和實際.cat文件名一致。這套流程走下來90%以上的簽名安裝問題都能定位到具體環(huán)節(jié)。剩下的10%基本是驅(qū)動本身代碼問題或者Windows版本差異那就只能具體問題具體分析了。最后再分享幾個實操細節(jié)整個方案的核心其實就一句話**自己創(chuàng)建證書讓系統(tǒng)信任這張證書然后用它給驅(qū)動簽名。**相比禁用驅(qū)動簽名這套方法更安全、更持久、也更符合企業(yè)內(nèi)網(wǎng)的管理規(guī)范。有幾個小細節(jié)在實際使用中幫了不少忙順手記在這里做簽名用的證書建議單獨申請一個受密碼保護的.pfx文件存放在只有管理員能訪問的位置不要放共享文件夾更不能提交到代碼倉庫。如果驅(qū)動更新頻繁建議把證書的有效期設(shè)置長一點10年配合時間戳使用能免去很多續(xù)期簽名的麻煩。Windows 11 22H2之后的版本系統(tǒng)對測試簽名模式的限制越來越嚴格新出的機器建議提前測試好流程別到現(xiàn)場再試。如果手頭有多臺測試機可以復(fù)用同一張證書完成簽名與部署不要求每臺機器都生成新證書。裝完驅(qū)動之后如果出現(xiàn)藍屏先啟動到安全模式禁用該驅(qū)動再從簽名和驅(qū)動代碼兩方面排查不要一上來就懷疑簽名方案有問題。目前我這邊企業(yè)內(nèi)網(wǎng)環(huán)境里幾十臺混裝Win10/Win11的機器都是用這套方案部署驅(qū)動的維護成本遠低于當初用“禁用簽名”那套方案。如果你正被驅(qū)動簽名搞得頭疼不妨按這個流程試試。