由于私钥过滤器,使用signtool进行代码签名失败

2023-12-25

在尝试签署我工作的公司创建的一些安装程序时,我遇到了一个错误,但我无法解决。我正在使用已在另一台计算机(Win7)上成功使用的相同证书,以相同的方式签署准相同的安装程序。无论如何,在运行 CruiseControl.net 的 Windows Server 2008 上,我尝试使用 Signtool.exe 对安装程序进行签名,但失败并出现以下错误:

The following certificates were considered:
    Issued to: <our company>
    Issued by: <some ca>
    Expires:   <is valid>
    SHA1 hash: <...>

    Issued to: <...>
    Issued by: <...>
    Expires:   <...>
    SHA1 hash: <...>

After EKU filter, 1 certs were left.
After expiry filter, 1 certs were left.
After Subject Name filter, 1 certs were left.
After Private Key filter, 0 certs were left.
SignTool Error: No certificates were found that met all the given criteria.

我尝试将证书安装到不同的证书存储区,尝试不同版本的signtool.exe并尝试直接使用.cer文件,但没有任何区别。在所有情况下我都会收到上述错误。我尝试了以下命令行命令

signtool.exe sign /debug /n "MyCompany" C:\my\installer.exe
signtool.exe sign /debug /f C:\path\to\my\certificate.cer C:\my\installer.exe

但在某些情况下我离开了 /debug。我有什么做错或遗漏的地方吗?


我有相同症状,但是总共不同的原因。与许多开发人员一样,我的系统上安装了许多不同的工具链。我只是对他们进行了调查,以展示这看起来如何;滚动到此答案的底部以获取完整列表。

我已将 VeriSign 的代码签名证书安装到系统证书存储区(需要/sm with signtool.exe)像往常一样,使用certutil -importPFX cert.pfx从提升的命令提示符。

第一次测试看起来很有希望,但突然签名开始失败。

为了调试我首先开始使用的问题signtool.exe sign /debug /v /a /sm ...以便查看出了什么问题。输出看起来像这样(另见问题):

The following certificates were considered:
    Issued to: localhost
    Issued by: localhost
    Expires:   Tue Dec 26 00:00:00 2017
    SHA1 hash: <...>

    Issued to: <...>
    Issued by: Symantec Class 3 SHA256 Code Signing CA
    Expires:   <...>
    SHA1 hash: <...>

After EKU filter, 1 certs were left.
After expiry filter, 1 certs were left.
After Root Name filter, 1 certs were left.
After Private Key filter, 0 certs were left.
SignTool Error: No certificates were found that met all the given criteria.

我可以排除丢失的私钥,因为证书存储清楚地表明了这一点我有一个matching私钥:

现在我记得有最近的一些补丁 https://technet.microsoft.com/en-us/library/security/3033929允许 Windows 7 接受使用具有 SHA256 哈希值的证书创建的签名。当然,大多数较旧的文章都会指出 Windows 7 根本无法处理 SHA-2 哈希值。

所以这已经让我朝着“它必须是涉及签名的旧版本”的方向前进。

I still决定删除证书加密钥并使用前面显示的调用重新导入它。

然后,在调查了我的系统(参见答案底部)之后,我发现了一个巨大的问题five不同版本的signtool.exe。所以我开始尝试最新的(6.3.9600.17298,来自 Windows 8.1 SDK)它立即起作用了:

signtool.exe sign /debug /v /a /sm /r VeriSign /ac MSCV-VSClass3.cer /ph  /t "http://timestamp.verisign.com/scripts/timstamp.dll" *.exe

The following certificates were considered:
    Issued to: localhost
    Issued by: localhost
    Expires:   Tue Dec 26 00:00:00 2017
    SHA1 hash: <...>

    Issued to: <...>
    Issued by: Symantec Class 3 SHA256 Code Signing CA
    Expires:   <...>
    SHA1 hash: <...>

After EKU filter, 1 certs were left.
After expiry filter, 1 certs were left.
After Root Name filter, 1 certs were left.
After Private Key filter, 1 certs were left.
The following certificate was selected:
    Issued to: <...>
    Issued by: Symantec Class 3 SHA256 Code Signing CA
    Expires:   <...>
    SHA1 hash: <...>

Cross certificate chain (using machine store):
    Issued to: Microsoft Code Verification Root
    Issued by: Microsoft Code Verification Root
    Expires:   Sat Nov 01 13:54:03 2025
    SHA1 hash: 8FBE4D070EF8AB1BCCAF2A9D5CCAE7282A2C66B3

        Issued to: VeriSign Class 3 Public Primary Certification Authority - G5
        Issued by: Microsoft Code Verification Root
        Expires:   Mon Feb 22 19:35:17 2021
        SHA1 hash: 57534CCC33914C41F70E2CBB2103A1DB18817D8B

            Issued to: Symantec Class 3 SHA256 Code Signing CA
            Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
            Expires:   Sat Dec 09 23:59:59 2023
            SHA1 hash: 007790F6561DAD89B0BCD85585762495E358F8A5

                Issued to: <...>
                Issued by: Symantec Class 3 SHA256 Code Signing CA
                Expires:   <...>
                SHA1 hash: <...>


The following additional certificates will be attached:
    Issued to: VeriSign Class 3 Public Primary Certification Authority - G5
    Issued by: Microsoft Code Verification Root
    Expires:   Mon Feb 22 19:35:17 2021
    SHA1 hash: 57534CCC33914C41F70E2CBB2103A1DB18817D8B

    Issued to: Symantec Class 3 SHA256 Code Signing CA
    Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
    Expires:   Sat Dec 09 23:59:59 2023
    SHA1 hash: 007790F6561DAD89B0BCD85585762495E358F8A5

Done Adding Additional Store
Successfully signed: <...>.exe

Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0

进一步追踪,我认为我已经找到了问题。然而,事实证明我得到的错误并不是我在旧版本中看到的错误signtool.exe版本。相反,旧版本会抱怨/ac, /fd and /ph分别是无法识别的命令行选项。

So I needed to dig a little deeper and it turned out that my (alternative) file manager was the culprit. I usually start my command prompts in the respective folder using that file manager and a handy keyboard shortcut. It turns out that it sometimes does not pass the environment variables - essentially the file manager "forgets" the environment variables. This turned out to be the root cause. A command prompt opened using Win+R and then cmd Enter would not expose this behavior despite executing signtool.exe from the same folder.

我对此的最佳猜测是,由于混乱PATH变量或类似变量,signtool.exe最终选择了错误的 DLL。尤其mssign32.dll and wintrust.dll 陪伴signtool.exeWindows SDK 8.0 和 8.1 位于同一文件夹中,但不适用于任何早期版本signtool.exe它将选择“全局”系统范围的 DLL,无论它们是什么。


在我的系统上我有five不同版本的signtool.exe.

签名工具.exe 5.2.3790.1830

甚至不明白/ac and /ph我正在使用的论点(也不是/fd)。但奇怪的是,没有这两个论点却有效。

  • C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\signtool.exe

签名工具.exe 6.0.4002.0

甚至不明白/ac and /ph我正在使用的论点(也不是/fd)。但奇怪的是,没有这两个论点却有效。

  • C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools\Bin\signtool.exe

签名工具.exe 6.1.7600.16385

第一个版本需要理解/fd sha256.

  • C:\WINDDK\7600.16385.1\bin\amd64\SignTool.exe
  • C:\WINDDK\7600.16385.1\bin\x86\SignTool.exe
  • C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\signtool.exe
  • C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\signtool.exe
  • C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe

签名工具.exe 6.2.9200.20789

  • C:\Program Files (x86)\Windows Kits\8.0\bin\x64\signtool.exe
  • C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool.exe

签名工具.exe 6.3.9600.17298

  • C:\Program Files (x86)\Windows Kits\8.1\bin\arm\signtool.exe
  • C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool.exe
  • C:\Program Files (x86)\Windows Kits\8.1\bin\x86\signtool.exe
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由于私钥过滤器,使用signtool进行代码签名失败 的相关文章

随机推荐

  • 如何在Tab布局中设置Tab宽度?

    我正在尝试创建一个tab layout其中有两个tabs 当我在小型手机上运行该应用程序时tab layout看起来不错 但是当我运行相同的应用程序时Tablet它显示如下 在平板电脑上看起来像这样 我希望每个选项卡占据整个空间 两端没有任
  • Javascript 验证 HTML 表单中的 X 个字段

    我有一个表单 其中包含大约 10 个文本条目 用户 地址 电子邮件等 大约有 50 多个条目是数量条目 用户选择该条目的 2 倍 该条目的 5 倍 现在 我从其他人那里继承了这张表格 现在我有责任在客户要求时保持最新状态 我不想全部重写 但
  • 如何将 core-js Map 导入 angular-cli webpack 生成的应用程序

    1 0 0 beta 11 webpack 现在使用 core js 进行 polyfill 我正在尝试导入地图以在我的应用程序中使用 import Map from core js es6 map import Map from core
  • 为什么合并 PDF 会使文件大小变大?

    我正在尝试将各种 PDF 拆分在一起 它们的文字不多 偶尔会有图像 举例来说 我有两个 PDF 1 4Mb 和 740kb 当我将它们合并时 它们会膨胀到 6Mb 我尝试过脚本化组合和手动附加 结果相同 所以我猜测这是一个根本问题 对为什么
  • 上下文在 Code First 模式下使用,其中的代码是从 EDMX 文件生成的,用于 Database First 或 Model First 开发

    我正在尝试将最初使用 EF4 开发的项目迁移到 EF6 以利用 EF6 事务管理 我面临的问题是该项目是使用数据库优先方法创建的 所以当我使用类似的代码时context Database UseTransaction 我遇到以下错误 The
  • Sublime text:如何将键绑定添加到 hex_viewer 包命令

    我已经在 sublime text 3 上安装了 Hex Viewer 包 为了切换它 我使用 ctrl shift p 打开命令面板 然后我搜索 hex 并选择包的命令来切换十六进制视图 我想知道如何将键绑定到特定的包命令 我知道键绑定配
  • IISExpress 用户界面 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我刚刚下载并安装了 IIS Express 从命令行运行它一切正常 但是我如何配置它的选项 是否有一个
  • Python os.path.relpath 行为

    我有一个目录bar在目录内foo 带文件foo file txt在目录中foo和文件bar file txt在目录中bar i e computer ls foo computer ls foo bar foo file txt compu
  • 云优化与云原生

    在尝试更好地理解云原生应用程序时 我遇到了云优化这个术语 有人可以帮助我了解云优化与云原生之间的区别吗 云优化涉及应用程序如何迁移到云或在那里开发和托管 如何通过优化过程来提供更多价值 降低成本 标准化事物 最初 一旦迁移或托管在云中 由于
  • 命令 APDU 在结果中返回 6985(不满足使用条件)

    我正在研究用 Java 读取智能卡 当我执行下面的代码时 卡返回 6985 不满足使用条件 TerminalFactory factory TerminalFactory getDefault List
  • 快速从网络抓取函数返回一个字符串

    好的 我正在抓取网页的一些基本数据 我想将我的代码重构为另一个类 并从我检索到的内容返回一个字符串 但这对于异步函数来说很困难 而且我对 swift 很陌生 我现在意识到这个函数无法返回字符串 但我不太清楚如何配置完成处理程序以及如何使用完
  • 添加新颜色以及自定义主题颜色 angular2 材质

    如何在 Angular 2 材质中添加新颜色 它在 ng2 material 文档中指定 color primary accent warn 被接受 我想添加类似 progressbarcolor 的内容 而不是在我的 angular2 材
  • 包括未找到模块 RubyMotion

    RubyMotion 中允许 mixin 吗 我有一个包含两个文件的目录 一个是类 另一个是模块 当我在类中包含模块 mixin 时 出现未找到错误 RM 中自动需要应用程序下的所有内容 对吗 谢谢你的帮助 找到了 http dylanma
  • Javascript WebWorker - 异步/等待

    我正在尝试卸载阻塞我的用户界面的长时间运行的进程 WebWorker 方法似乎是解决这种情况的最佳方法 但是 我需要使用的库之一具有 async await WebWorker 的 JS API 有限 并且似乎没有 async await
  • 比较 javascript/jquery 中的两种日期格式

    我有以下内容 var fit start time fit start time val 2013 09 5 var fit end time fit end time val 2013 09 10 if Date parse fit st
  • 如何解析rabbitmq状态输出?

    我在 Linux 上安装了 RabbitMQ 它是一个很棒的软件 当我运行这个命令时 sudo rabbitmqctl status 我得到一团糟的输出 pid 18665 running applications rabbitmq man
  • 如何通过代码打开 Vaadin ComboBox?

    是否可以开一个Vaadin ComboBox通过代码 我想展示两个相互依赖的组合框 当用户在第一个组合框中选择一个值时 我希望第二个组合框自动打开可能的选择 以便用户可以直接选择一个 而不必自己打开第二个组合框 也许我可以发送一个事件来触发
  • 如何比较java中的两个字符串并按字母顺序定义其中一个比另一个小?

    我想使用二分搜索算法来搜索用户在一个非常大的排序文件中输入的字符串 我无法将用户输入的字符串与位于文件中间行的字符串进行比较以继续我的二分搜索 例如 如果用户的字符串是abcda文件的字符串是abcza 很明显用户的字符串比文件的字符串小
  • 错误 C4996:“scanf”:此函数或变量在 C 编程中可能不安全

    我创建了一个小型应用程序 通过使用带参数的用户定义函数来查找最大数量 当我运行它时 它显示此消息 错误 1 错误 C4996 scanf 此函数或变量可能不安全 考虑使用 scanf s 代替 要禁用弃用 请使用 CRT SECURE NO
  • 由于私钥过滤器,使用signtool进行代码签名失败

    在尝试签署我工作的公司创建的一些安装程序时 我遇到了一个错误 但我无法解决 我正在使用已在另一台计算机 Win7 上成功使用的相同证书 以相同的方式签署准相同的安装程序 无论如何 在运行 CruiseControl net 的 Window