首页 > 解决方案 > STATUS_NOT_FOUND 为 signtool.exe 中的“意外内部错误”

问题描述

我的问题与有关。唉,这个问题是关于不同的 CA(赛门铁克)并使用不同的硬件令牌(来自 Safenet),虽然那里提供的解决方案与错误代码相匹配,但我的情况不匹配(除其他外,智能卡提供给我的似乎没有在HKLM\SYSTEM\CurrentControlSet\Control\Cryptography\Providers) 下注册自己的提供者。

我正在使用来自 certum.pl 的开源代码签名证书。我正在使用signtool.exeWindows 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......我的意思是布局HRESULTNTSTATUS)。

唉,这并没有告诉我任何事情,因为在任何给定时间都可能找不到很多东西……在撰写本文时,我仍在尝试使用 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,详情如下截图:

proCertum CardManager 软件版本 3.2.0.156

(这是撰写本文时可从 Certum 网站获得的最新版本。)


同时,我还尝试了signtool.exe(分别为 x86 和 64):

...相同的结果,我对如何解决这个问题感到困惑。

标签: code-signingsigntool

解决方案


原来问题出在默认情况下未正确设置的选项(名称表明它仅适用于 EV 证书,但似乎适用于具有 SHA2 摘要的选项)。感谢 Certum 的支持人员!

proCertum CardManager 选项对话框

我强调了相关选项。

另请注意,我必须

  1. 退出应用程序(从 TNA 又名“系统托盘”)
  2. 启动从其程序文件夹提升的应用程序
  3. 选中复选框
  4. 点击确定按钮
  5. 关闭(成功)消息框
  6. 重启

...当我之前尝试过没有提升时,该过程失败了。是的,我看到了“盾牌”图标,但我假设应用程序包含执行提升的逻辑(它没有)。

当我在重新启动后重试签名时,不再是 proCertum CardManager 提示输入卡的 PIN,而是 Windows。签约就像一种魅力。

注意:HKLM\SYSTEM\CurrentControlSet\Control\Cryptography\Providers在这些步骤之后,下面仍然没有条目。


推荐阅读