使用eToken EV代码签名证书时SignTool报错:无法关联私钥与证书
问题
刚收到用于EV代码签名证书的eToken(小型USB加密狗),尝试用它为代码签名。在管理员权限的Windows Powershell中运行以下命令:
$signtool_path = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\signtool.exe" & $signtool_path sign /debug /n "<My Certificate Name>" /csp "eToken Base Cryptographic Provider" /k "Sectigo_20240215105611" /tr http://timestamp.sectigo.com /td SHA256 /fd SHA256 "C:\path\to\my\application\main.exe"
返回错误:
After EKU filter, 1 certs were left. After expiry filter, 1 certs were left. After Subject Name filter, 1 certs were left. The following certificate was selected: Issued to: <My Certificate Name> Issued by: Sectigo Public Code Signing CA EV R36 Expires: Sat Feb 14 16:59:59 2026 SHA1 hash: <Some Hash Code> SignTool Error: An unexpected internal error has occurred. Error information: "Could not associate private key with certificate." (-2147024891/0x80070005)
需解决私钥与证书的关联问题。
解决方案
1. 确认eToken驱动与工具安装
- 安装eToken官方配套的SafeNet Authentication Client(或对应品牌管理工具),确保驱动版本适配当前Windows系统。
- 安装完成后重启电脑,插入eToken,等待系统完成设备识别与驱动加载。
2. 验证eToken内证书与私钥状态
- 打开eToken管理工具,检查设备内是否存在目标代码签名证书及关联私钥。
- 确认私钥标记为可访问状态,无额外权限限制。
3. 调整signtool命令参数
- 移除
/k参数,改用/sha1指定证书的SHA1哈希值(错误信息中已提供该哈希),命令示例:
& $signtool_path sign /debug /sha1 "<Some Hash Code>" /csp "eToken Base Cryptographic Provider" /tr http://timestamp.sectigo.com /td SHA256 /fd SHA256 "C:\path\to\my\application\main.exe"
- 若仍报错,添加
/sm参数指定从智能卡/加密硬件读取证书:
& $signtool_path sign /debug /sm /n "<My Certificate Name>" /csp "eToken Base Cryptographic Provider" /tr http://timestamp.sectigo.com /td SHA256 /fd SHA256 "C:\path\to\my\application\main.exe"
4. 检查系统权限与加密服务
- 打开服务管理器,找到
Cryptographic Services,右键进入属性→安全选项卡,确认当前用户拥有读取和启动服务的权限。 - 若报错含
0x80070005(权限拒绝),尝试以本地系统账户运行PowerShell,或检查eToken的访问权限设置。
5. 重置eToken容器(谨慎操作)
- 若上述步骤无效,可在eToken管理工具中重新导入证书与私钥(需提前备份),或联系Sectigo协助重置eToken内的密钥容器。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

