signtool 报错:无法识别格式
根本原因:signtool.exe 不支持直接签名 .hlkx 文件
hlkx 是 OPC 开放打包格式(zip‑xml 容器),使用 XML‑DSIG 包内签名,不是 Authenticode 签名;signtool 只处理 exe/dll/cat 这类PE Authenticode文件,所以直接丢hlkx进去必然报无法识别格式 。
错误做法:signtool sign xxx.hlkx(网上部分文档是错误的)
三种正确签名hlkx方案(WHQL提交)
方案1:HLK‑Studio内签名(官方原生,U‑Key本地EV证书)
1. HLK Studio打开项目 → Create Submission
2. 签名选项选择本机已安装的EV代码签名证书(Certum EV)
3. 内部完成OPC包签名,输出已签名hlkx包
缺点:云端Keylocker(Certum无U‑key)证书,HLK Studio原生不识别,无法用此方式
globalsign、digicert等ukey存储证书的品牌适用此方式。
方案2:开源工具 OpenOpcSignTool / HlkSigner(适配certum云端HSM/Keylocker,最常用)
专门给OPC‑hlkx做XML数字签名,支持AzureSignTool、Certum Keylocker云端EV证书,替代signtool处理hlkx 。
powershell
# OpenOpcSignTool示例,对接云端EV
OpenOpcSignTool sign --input test.hlkx --output test_signed.hlkx --azure-sign ...
关键点:sys/cat驱动二进制文件,仍然要用signtool先做Authenticode SHA256+RFC3161时间戳签名,再打包生成hlkx;hlkx只是测试报告包。
方案3:不本地签hlkx,裸hlkx直接上传微软硬件仪表板(最省事)
- 把未签名hlkx上传微软硬件开发者后台
- 后台会使用已经绑定账号的EV证书完成hlkx签名(Attest提交模式)
条件:EV证书指纹已经录入微软硬件账号;驱动sys/cat本地必须signtool签好SHA256+时间戳。
该方式是国内使用Certum Keylocker云端EV最省事路径。
完整正确WHQL流程(Certum Keylocker云端EV)
1. 驱动sys、cat文件:signtool(AzureSignTool)签名 SHA256 + RFC3161时间戳 (这一步signtool干)
2. HLK跑完全部测试,导出未签名hlkx
3. 路径A:未签名hlkx直接上传微软硬件仪表板,后台代签(推荐,Keylocker首选)
4. 路径B:本地OpenOpcSignTool调用Keylocker对hlkx做OPC签名,之后上传
高频踩坑点
1. 使用signtool直接签名hlkx → 报无法识别格式(你遇到的报错)
2. 混淆:signtool只管驱动二进制,不管hlkx报告包
3. Certum Keylocker云端EV:HLK Studio图形界面无法读取云端密钥,不能用Studio内签名,只能选方案3上传代签或者OpenOpcSignTool工具。
4. 驱动sys/cat如果没提前signtool签名,即便hlkx签好,微软后台直接驳回。
快速校验排查
1. 先拿signtool签名一个exe,确认你的EV证书(Keylocker/AzureSignTool)本身工作正常。
2. hlkx改后缀zip解压,看内部文件是否完整,排除hlkx包损坏。
3. 确认EV证书SHA1指纹已经录入微软硬件开发者中心账号。
OpenOpcSignTool对接Certum Keylocker的实操命令模板
OpenOpcSignTool(OpenVsixSignTool)对接 Certum SimplySign‑Keylocker 签名 hlkx
前提:SimplySign Desktop 必须后台登录运行,证书已经加载进本机 Windows 证书存储(Current‑UserMy),工具读取证书存储里的云端EV证书,私钥实际在Certum HSM云端,本机只存公钥与证书上下文。
工具原名: OpenVsixSignTool ,就是 OpenOpcSignTool,dotnet 全局工具 。
1、安装工具(Windows,需要.NET6+)
powershell
dotnet tool install -g OpenVsixSignTool
安装完直接在PowerShell/CMD调用 OpenVsixSignTool
2、命令模板(本地证书存储模式‑Certum SimplySign)
powershell
OpenVsixSignTool sign ^
--sha1 "你的EV证书SHA1指纹大写去掉空格" ^
--input "D:hlk est.hlkx" ^
--output "D:hlk est_signed.hlkx" ^
--timestamp http://time.certum.pl ^
-fd sha256 ^
-ta sha256 ^
-v
参数说明
- --sha1 :EV证书SHA1指纹,SimplySign Desktop里复制,全部大写,无空格
- --input :HLK Studio导出未签名hlkx
- --output :输出签名后的hlkx
- --timestamp :Certum时间戳 http://time.certum.pl ,必须带,防止证书过期签名失效
- -fd sha256 :包内摘要算法,微软强制
- -ta sha256 :时间戳摘要算法
- -v :verbose输出排错
限制:必须保持 SimplySign Desktop 登录驻留后台,签名操作会触发SimplySign弹窗TOTP二次确认(手机SimplySign App确认),无法完全无交互headless,CI自动化很难跑通。
3、对比方案:HLKSigner(备选工具,github tracenyx/hlksigner)
专门针对hlkx,OPC‑XML‑DSIG签名,但是它原生只对接Azure Key‑Vault,不能直接对接Certum SimplySign Keylocker,不适合你的环境。
最推荐 Certum Keylocker 的实际生产方案(绕开本地hlkx签名坑)
不本地签hlkx,这是Certum云端EV最稳路径:
1. signtool(配合SimplySign Desktop)先签好 sys/cat驱动二进制 SHA256+时间戳
2. HLK跑测试,导出未签名hlkx
3. 直接上传微软硬件仪表板,后台Attest模式自动完成hlkx签名;前提EV证书SHA1指纹已经录入微软硬件开发者账号
好处:不需要OpenVsixSignTool、不需要TOTP弹窗、无工具兼容坑,国内绝大多数Certum‑Keylocker用户走这条。
常见报错排查
1. Cannot find certificate :确认SimplySign Desktop已登录;证书出现在 certmgr.msc → 当前用户‑个人 ;指纹大小写完全一致。
2. 签名时卡住无响应:SimplySign App需要手动点确认签名请求,不要锁屏。
3. 上传微软后台报签名无效:检查时间戳服务器网络;必须使用 http://time.certum.pl ;确认驱动sys/cat提前已经Authenticode签名。
完整bat批处理模板:先signtool批量签sys/cat,再OpenVsixSignTool签hlkx
完整批处理模板(bat)
环境要求
1. 已安装 SimplySign Desktop,保持登录状态
2. 已安装 OpenVsixSignTool(dotnet global tool)
3. signtool 在系统PATH,或者填写完整路径
4. .NET 6 或更高版本
5. 修改脚本内:证书SHA1指纹、文件路径
batch
@echo off
chcp 65001
setlocal enabledelayedexpansion
:: ======================配置区,请修改这里======================
set "CERT_SHA1=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
set "TIMESTAMP_URL=http://time.certum.pl"
:: 驱动目录,存放 sys cat
set "DRIVER_FOLDER=D:hlkdriver"
:: hlkx源文件与输出文件
set "HLKX_INPUT=D:hlk est.hlkx"
set "HLKX_OUTPUT=D:hlk est_signed.hlkx"
:: =============================================================
echo.
echo ==========第一步:对目录下所有 sys cat 执行 Authenticode签名==========
for %%f in ("%DRIVER_FOLDER%*.sys","%DRIVER_FOLDER%*.cat") do (
echo 正在签名 %%~nxf
signtool sign ^
/sha1 %CERT_SHA1% ^
/fd sha256 ^
/tr %TIMESTAMP_URL% ^
/td sha256 ^
/v "%%f"
if !errorlevel! neq 0 (
echo ERROR:%%~nxf 签名失败
pause
exit /b !errorlevel!
)
)
echo.
echo ==========第二步:OpenVsixSignTool 签名 hlkx OPC包==========
OpenVsixSignTool sign ^
--sha1 "%CERT_SHA1%" ^
--input "%HLKX_INPUT%" ^
--output "%HLKX_OUTPUT%" ^
--timestamp "%TIMESTAMP_URL%" ^
-fd sha256 ^
-ta sha256 ^
-v
if %errorlevel% equ 0 (
echo.
echo ======================================
echo 全部完成!输出文件:%HLKX_OUTPUT%
echo 注意:签名hlkx会弹出SimplySign手机TOTP确认
echo ======================================
) else (
echo hlkx签名执行失败
)
pause
使用要点
1. 把上述内容保存为 SignDriverHlkx.bat
2. 修改配置区4项参数:证书SHA1指纹、路径
3. 运行bat前:SimplySign Desktop必须登录;手机SimplySign App待命,hlkx签名环节会推送确认请求,需要手动点确认,无法静默自动化。
4. signtool报错找不到证书:打开 certmgr.msc → 当前用户‑个人,确认EV证书存在。
生产环境强烈提醒
Certum Keylocker场景,优先推荐不本地签hlkx
sys/cat本地signtool签好 → 导出未签名hlkx → 直接上传微软硬件仪表板,后台Attest代签hlkx。
可以规避OpenVsixSignTool依赖、TOTP弹窗、工具版本兼容、网络时间戳异常一堆问题。
验证签名是否有效
1)验证sys/cat
batch
signtool verify /pa /v xxx.sys
查看:有签名、时间戳正常、算法sha256。
2)验证hlkx
OpenVsixSignTool自带校验命令
powershell
OpenVsixSignTool verify --input D:hlk est_signed.hlkx -v
常见坑
1. 执行到hlkx步骤卡住:手机没有点SimplySign签名确认;电脑锁屏会中断请求。
2. 时间戳访问失败:国内网络访问 time.certum.pl 偶尔丢包,可切换网络重试。
3. 不要用signtool去打开/校验hlkx,它不认OPC包格式。