Windows 7已签名驱动启动失败,错误码0xC0000428求助
我之前帮客户处理过几乎一模一样的问题——Windows 7对SHA256代码签名的兼容性坑确实不少,尤其是更换CA(从GlobalSign到DigiCert)之后,很容易出现验证失败的情况。结合你的描述,给你整理几个针对性的排查和解决步骤:
1. 先确认Windows 7的SHA256支持补丁是否装全
别以为只装了单个SHA256热修复就够了,Windows 7需要一套完整的补丁组合才能正常识别SHA256签名的驱动:
- KB2999226:先装这个通用CRT更新,很多驱动依赖它的基础组件
- KB3033929:启用系统对SHA-2代码签名的支持
- KB3063858:更新根证书库,让Windows 7信任DigiCert的SHA2根证书链
一定要按这个顺序安装,装完每个都重启,最后再整体重启一次。很多人漏掉了KB3063858,导致DigiCert的证书根链不被系统信任,直接触发0xC0000428错误。
2. 确保签名时带上完整的DigiCert中间证书链
你用的signtool命令里没有指定中间证书,这很可能是问题所在。Windows 7不像新系统那样能自动拉取中间证书,必须在签名时把中间证书一起嵌入。
步骤如下:
- 从DigiCert官网下载对应你证书的SHA2中间证书(比如
DigiCertSHA2CodeSigningCA.crt) - 修改签名命令,加上
/ac参数指定中间证书:
"C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe" sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /ac "DigiCertSHA2CodeSigningCA.crt" /a "C:\ICS\IM6000\filter\objfre_win7_AMD64\amd64\icsflt.sys"
签完之后,右键驱动文件→属性→数字签名,查看证书路径,确保从你的代码签名证书到DigiCert的SHA2根证书(比如DigiCert Global Root G2)的整个链都是“正常”状态,没有红色叉号。
3. 验证时间戳是否符合SHA2要求
Windows 7对SHA2签名的时间戳也有严格要求,必须是SHA2算法的时间戳。你用的http://timestamp.digicert.com是对的,但要确保signtool版本足够新(你用的Windows Kits 8.1版本没问题,别用VS2010自带的旧版signtool)。
可以用下面的命令验证签名细节:
signtool.exe verify /v /pa "C:\ICS\IM6000\filter\objfre_win7_AMD64\amd64\icsflt.sys"
看输出里的“时间戳签名算法”部分,必须是sha256RSA,如果是SHA1的时间戳,Windows 7会直接拒绝验证。
4. 尝试正确的双签名(SHA1 + SHA2)兼容方案
你说试过双签名,但可能步骤不对。正确的双签名应该先签SHA1,再追加SHA2签名,而且要对应各自的中间证书:
# 第一步:SHA1签名(搭配SHA1时间戳和SHA1中间证书) signtool.exe sign /tr http://timestamp.digicert.com /td sha1 /fd sha1 /ac "DigiCertSHA1CodeSigningCA.crt" /a "C:\ICS\IM6000\filter\objfre_win7_AMD64\amd64\icsflt.sys" # 第二步:追加SHA256签名(搭配SHA2时间戳和SHA2中间证书) signtool.exe sign /tr http://timestamp.digicert.com /td sha256 /fd sha256 /ac "DigiCertSHA2CodeSigningCA.crt" /as /a "C:\ICS\IM6000\filter\objfre_win7_AMD64\amd64\icsflt.sys"
/as参数是关键,它会在现有签名基础上追加新的签名,而不是覆盖。这样Windows 7会优先识别SHA1签名(如果补丁不全),补丁全的话会用SHA2,完美兼容。
5. 手动导入DigiCert根证书到系统信任库
如果装了KB3063858还是不行,可能是系统根证书库没有正确更新。手动导入DigiCert的SHA2根证书:
- 下载DigiCert Global Root G2证书
- 右键证书文件→安装证书→选择“本地计算机”→下一步
- 选择“将所有证书放入下列存储”→浏览→选择“受信任的根证书颁发机构”
- 完成后重启系统,再尝试加载驱动
最后,签完驱动一定要用signtool verify命令检查,或者查看文件属性里的数字签名,确保所有签名的证书链都是完整有效的。
内容的提问来源于stack exchange,提问作者Sarah Weinberger

