code-signing - STATUS_NOT_FOUND 为 signtool.exe 中的“意外内部错误”
问题描述
我的问题与此有关。唉,这个问题是关于不同的 CA(赛门铁克)并使用不同的硬件令牌(来自 Safenet),虽然那里提供的解决方案与错误代码相匹配,但我的情况不匹配(除其他外,智能卡提供给我的似乎没有在HKLM\SYSTEM\CurrentControlSet\Control\Cryptography\Providers
) 下注册自己的提供者。
我正在使用来自 certum.pl 的开源代码签名证书。我正在使用signtool.exe
Windows SDK 中的10.0.18362.0
,我看到以下错误(带有signtool sign /v /debug
):
signtool.exe sign /v /debug /a /i Certum /ph /du "https://my.url" /d "short description" /fd sha256 /tr "http://timestamp.digicert.com" /td sha256 "mysoftware.exe"
The following certificates were considered:
Issued to: Open Source Developer, ...
Issued by: Certum Code Signing CA SHA2
Expires: ...
SHA1 hash: ...
Issued to: Open Source Developer, ...
Issued by: Certum Code Signing CA SHA2
Expires: ...
SHA1 hash: ...
After EKU filter, 2 certs were left.
After expiry filter, 1 certs were left.
After Issuer Name filter, 1 certs were left.
After Private Key filter, 1 certs were left.
The following certificate was selected:
Issued to: Open Source Developer, ...
Issued by: Certum Code Signing CA SHA2
Expires: ...
SHA1 hash: ...
Done Adding Additional Store
Error information: "Error: SignerSign() failed." (-1073741275/0xc0000225)
SignTool Error: An unexpected internal error has occurred.
错误代码0xC0000225
与以下内容完全匹配NTSTATUS
:
//
// MessageId: STATUS_NOT_FOUND
//
// MessageText:
//
// The object was not found.
//
#define STATUS_NOT_FOUND ((NTSTATUS)0xC0000225L)
...这是完全有道理的,给定HRESULT
的代码signtool.exe
和底层基础设施映射 1:1 到NTSTATUS
(当然,如果给出了设施代码,则HRESULT
存在没有名称的代码ntstatus.h
......我的意思是布局HRESULT
和NTSTATUS
)。
唉,这并没有告诉我任何事情,因为在任何给定时间都可能找不到很多东西……在撰写本文时,我仍在尝试使用 ProcMon 自行缩小范围。对于失败的尝试,我NAME NOT FOUND
在 ProcMon 中看到了 592 个结果,应该对应于上面的NTSTATUS
代码;其中大部分用于注册表项和值。
这是完整的signtool
命令行:
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64\signtool.exe" 标志 /v /debug /a /i Certum /ph /du " https://my.url " /d "简短描述" /fd sha256 /tr " http://timestamp.digicert.com " /td sha256 "mysoftware.exe"
...是的,我验证了它确实在使用它signtool.exe
...事实上,我尝试使用带有完整路径的 x86 和 x64 以获得良好的测量效果(我的实际脚本包含了一些复杂性并准备环境以进行调整PATH
以能够调用signtool.exe
没有完整的路径)。
奇怪的是,它在使用 SHA1 摘要签名时有效,如下所示:
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64\signtool.exe" 标志 /v /debug /a /i Certum /ph /du " https://my.url " /d "简短描述" /t " http://timestamp.digicert.com " "mysoftware.exe"
(区别在于缺少时间戳服务 URL/fd sha256
以及/td sha256
代替时间戳服务 URL,即不同的协议)/t
/tr
proCertum CardManager 软件的版本是 3.2.0.156,详情如下截图:
(这是撰写本文时可从 Certum 网站获得的最新版本。)
同时,我还尝试了signtool.exe
(分别为 x86 和 64):
- 视窗 8.1 SDK
- Windows 10.0.17763.0 SDK
...相同的结果,我对如何解决这个问题感到困惑。
解决方案
原来问题出在默认情况下未正确设置的选项(名称表明它仅适用于 EV 证书,但似乎也适用于具有 SHA2 摘要的选项)。感谢 Certum 的支持人员!
我强调了相关选项。
另请注意,我必须
- 退出应用程序(从 TNA 又名“系统托盘”)
- 启动从其程序文件夹提升的应用程序
- 选中复选框
- 点击确定按钮
- 关闭(成功)消息框
- 重启
...当我之前尝试过没有提升时,该过程失败了。是的,我看到了“盾牌”图标,但我假设应用程序包含执行提升的逻辑(它没有)。
当我在重新启动后重试签名时,不再是 proCertum CardManager 提示输入卡的 PIN,而是 Windows。签约就像一种魅力。
注意:HKLM\SYSTEM\CurrentControlSet\Control\Cryptography\Providers
在这些步骤之后,下面仍然没有条目。
推荐阅读
- asp.net-core - ASP.NET 无法添加引用
- firebase - Flutter 中处理 Firebase 权限不足错误
- java - 如何在没有 location.reload() 的 POST 请求后刷新页面内容
- python - 熊猫如何根据索引值改变系列并保留其他系列值
- angular - 如何从 Angular 7 中的 url 字符串获取路由对象?
- java - 使用杰克逊反序列化包含 @JsonFormat(shape=JsonFormat.Shape.ARRAY) 和自定义对象的 json
- angular - 我的 Angular 应用程序使用 SSO 进行身份验证,它将标头中的用户详细信息返回给应用程序。如何解析传入的标头?
- oracle - 使用oracle正则表达式子字符串时检查表中是否存在值
- rails-activestorage - 即使在出错后也能保存主动存储附件
- javascript - 如何将数据从socket io显示到html页面列表