STATUS_NOT_FOUND为signtool.exe中的“意外内部错误”

问题描述 投票:7回答:1

我的问题与this one有关。 las,这个问题是关于不同的CA(Symantec),并且使用了不同的硬件令牌(来自Safenet),并且尽管那里提供的解决方案与错误代码匹配,但我的情况不正确(尤其是智能卡)提供给我的似乎没有在HKLM\SYSTEM\CurrentControlSet\Control\Cryptography\Providers下注册自己的提供程序。

我正在使用certum.pl中的开放源代码签名证书。我正在使用Windows SDK signtool.exe中的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(当然if给出了设施代码,HRESULT存在ntstatus.h中没有名称的代码...我的意思是HRESULTNTSTATUS的布局。

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


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

“ C:\ Program Files(x86)\ Windows Kits \ 10 \ bin \ 10.0.18362.0 \ x64 \ signtool.exe” sign / 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” sign / v / debug / a / i Certum / ph / du“ https://my.url” / d “简短说明” / t“ http://timestamp.digicert.com”“ mysoftware.exe”

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

proCertum CardManager软件的版本为3.2.0.156,详细信息根据以下屏幕截图:

proCertum CardManager software version 3.2.0.156

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


与此同时,我也尝试了signtool.exe(分别来自x86和64):

  • Windows 8.1 SDK
  • Windows 10.0.17763.0 SDK

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

code-signing signtool
1个回答
2
投票

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

proCertum CardManager Options dialog

我强调了相关选项。

还请注意,我必须

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.