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