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

时间:2019-11-10 22:26:50

标签: code-signing signtool

我的问题与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

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

1 个答案:

答案 0 :(得分:2)

原来的问题是,默认情况下未正确设置此选项(名称建议该选项仅适用于EV证书,但 似乎也适用于具有SHA2摘要的证书)。感谢Certum的支持!

proCertum CardManager Options dialog

我突出显示了相关选项。

还请注意,我必须

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

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

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

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