STATUS_NOT_FOUND 作为 "An unexpected internal error" 在 signtool.exe

STATUS_NOT_FOUND as "An unexpected internal error" in signtool.exe

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

下注册自己的提供商

我正在使用来自 certum.pl 的开源代码签名证书。我正在使用 Windows SDK 10.0.18362.0 中的 signtool.exe,我看到以下错误(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)

...这很有意义,给定 signtool.exe 使用的 HRESULT 代码和底层基础设施映射 1:1 到 NTSTATUS(当然 如果给出了一个设施代码,HRESULT代码存在ntstatus.h中没有名字...我的意思是HRESULT和[=20的布局=]).

唉,这并没有告诉我任何信息,因为在任何给定时间可能找不到很多东西......在撰写本文时,我仍在尝试使用 ProcMon 自行缩小范围。对于失败的尝试,我在 ProcMon 中看到了 592 NAME NOT FOUND 个结果,这应该对应于上面的 NTSTATUS 代码;其中大部分用于注册表项和值。


这里又是完整的 signtool 命令行:

"C:\Program Files (x86)\Windows Kits\bin.0.18362.0\x64\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"

... 是的,我证实它确实在使用 signtool.exe... 事实上,我尝试使用具有完整路径的 x86 和 x64 进行良好测量(我的实际脚本包含了一些复杂性和准备环境以调整 PATH 以便能够在没有完整路径的情况下调用 signtool.exe

奇怪的是,它在使用 SHA1 摘要签名时有效,如下所示:

"C:\Program Files (x86)\Windows Kits\bin.0.18362.0\x64\signtool.exe" sign /v /debug /a /i Certum /ph /du "https://my.url" /d "short description" /t "http://timestamp.digicert.com" "mysoftware.exe"

(区别在于时间戳服务 URL 缺少 /fd sha256/td sha256 以及 /t 而不是 /tr,即不同的协议)

proCertum CardManager软件版本为3.2.0.156,详情如下截图:

(这是撰写本文时 Certum 网站上提供的最新版本。)


我同时也尝试使用 signtool.exe(分别为 x86 和 64)来自:

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

原来问题是默认设置不正确的选项(名称表明它只适用于 EV 证书,但似乎适用于那些与 SHA2 摘要)。感谢 Certum 的支持人员!

我突出显示了相关选项。

另请注意,我必须

  1. 退出应用程序(来自 TNA 又名 "system tray")
  2. 从其程序文件夹
  3. 启动应用程序提升
  4. 选中复选框
  5. 点击确定按钮
  6. 关闭(成功)消息框
  7. 重启

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

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

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