【问题标题】:Why does signtool.exe only find certificate when run as admin?为什么 signtool.exe 以管理员身份运行时只能找到证书?
【发布时间】:2019-10-27 01:24:01
【问题描述】:

我正在设置一台新的开发笔记本电脑,并安装了自发行的代码签名证书。我可以在我当前用户的个人证书下的 certmgr 中看到它。

当我尝试从 Visual Studio 2017 的开发人员命令提示符构建时,我得到:
error : SignTool Error: No certificates were found that met all the given criteria.

这在我的旧笔记本电脑上总是很好用。

我发现如果我在以管理员身份启动后从命令提示符运行相同的构建,signtool 会成功并且可以找到证书。

我们设置新笔记本电脑时,有 3/4 的同事遇到过这种情况。一个人没问题,无需以管理员身份运行即可签名。在我们的旧笔记本电脑上,我们无需以管理员身份运行。

我尝试用谷歌搜索找出可能的原因,因为我不知道是否以管理员身份运行应该对此有任何影响。我没有找到任何关于这个问题的参考。

我们如何在不以管理员身份运行的情况下使用 signtool.exe?

当不以管理员身份运行时,它似乎在私钥过滤步骤中,我希望被选中的证书被过滤掉:

**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.12
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************

C:\>signtool sign /v /debug /ph  /i "<issuedby>"  /fd sha256 /td sha256 "C:\TestSign.dll"

The following certificates were considered:
    Issued to: Scott Langham
    Issued by: <issuedby>
    Expires:   Sun Sep 25 09:54:55 2022
    SHA1 hash: <a_hash>

    Issued to: Scott Langham
    Issued by: <issuedby_somethingelse>
    Expires:   Wed May 13 15:51:14 2020
    SHA1 hash: <b_hash>

After EKU filter, 1 certs were left.
After expiry filter, 1 certs were left.
After Issuer 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 版本与我的同事正在使用的版本相同 (10.0.18362.1)。我已经能够发现我们系统之间的任何其他差异。

【问题讨论】:

  • 看起来其他人也有类似的问题。解决方案是以管理员身份运行。我希望能够不像过去那样以管理员身份运行。 stackoverflow.com/a/56342401/11898
  • 您是否尝试过使用签名证书的 SHA1 指纹进行签名? (/sha1 选项)。我一直觉得这是最简单的方法。
  • 这意味着您的 signtool.exe 中的 bool Certificate::HasPrivateKey() 返回 false。因为CryptAcquireCertificatePrivateKey 失败。更快NCryptOpenKey 失败。尝试打开存储您的私钥的文件时失败,因为当以管理员身份运行时访问被拒绝。这很奇怪,因为它要求只读访问。需要在调试器下查看失败的地方。我无法重现此问题
  • 您曾写过“这在我的旧笔记本电脑上一直运行良好。”你的旧笔记本电脑是什么操作系统,你的新笔记本电脑是什么操作系统?
  • @Aleksandar 旧笔记本电脑是 Win8.1,新的是 Win10。但这也发生在同事身上,他们也有新的笔记本电脑,他们的旧笔记本电脑是 Win10。

标签: windows certificate code-signing code-signing-certificate signtool


【解决方案1】:

我今天遇到了这个问题,这就是我现在能够通过命令行运行 signtool.exe 而无需提升为管理员的方法。

  • 运行“mmc”并添加“证书”管理单元
  • 选择正确的密钥存储位置
    • (我的是本地计算机,所以我在这里选择“计算机帐户”)
  • 查找并选择证书
  • 右击证书,选择All Tasks > Manage Private Keys...

  • 在“私钥权限”对话框中,添加您的用户帐户,然后给自己“完全控制”。您现在可以使用正常的命令提示符进行签名了。

  • 注意:如果您使用构建机器,请为执行构建的帐户执行上述步骤。

【讨论】:

  • 太棒了!我在 Current User\Personal 商店中有我的证书,在那里看不到“管理私钥...”选项。但是,在将证书导出并导入本地计算机\个人存储后,我可以访问该选项并调整权限。现在它对我有用!非常感谢,这个问题每天困扰我好几次!
【解决方案2】:

与@Baget 所说的类似,我会将您机器上的证书与您的同事的证书进行比较,后者可以在没有提升令牌的情况下成功运行 SignTool.exe 命令。这里有一大块 PowerShell 可以帮助您:

get-childitem -Path Cert:\ | foreach-object ({
    $location = $_.Location
    foreach($store in $_.StoreNames.Keys) {         
        get-childitem -Path "Cert:\$location\$store" | foreach-object ({
            $thumb = $($_.ThumbPrint)
            $issuer = $($_.Issuer)

            if ($issuer -eq "CN=EXAMPLE, DC=EXAMPLE, DC=EXAMPLE, DC=EXAMPLE") {
                write-host "$location $store $issuer"
            }
        })
    }
})

请记住,如果您以普通用户身份运行并“以管理员身份运行”,上述输出可能会略有不同。

最后,你和你的同事是否有相同的 UAC 设置?

【讨论】:

    【解决方案3】:

    我发现自己在使用 signtool 时遇到了类似的情况,它拒绝与管理员用户合作,但确实可以作为实际管理员工作。

    在我的情况下,我实际上并没有将证书导入证书存储,而是使用从 firefox 中的 comodo 证书导出的 .pkcs12 文件,所以这让事情变得更加奇怪,因为对存储中的任何密钥都没有权限参与其中。

    我尝试授予自己对某些服务器密钥的权限,但没有任何效果。

    我希望有人能找到解决这个问题的方法。

    与此同时,我正在使用osslsigncode 签署我的exe,这非常有效。

    我从 msys2 mingw64 构建中提取了 exe 和依赖的 dll,这是所有内容的 zip,以防任何人使用,只需将其解压缩到一个目录并将其放入您的 PATH

    http://cachemiss.com/files/osslsigncode.zip

    要自己从 msys2 安装中提取此程序,您可以使用以下命令:

    pacman --noconfirm -S mingw-w64-x86_64-osslsigncode
    cd /mingw64/bin
    mkdir ~/osslsigncode
    cp osslsigncode.exe $(ldd osslsigncode.exe | sed -n 's,^.*\(/mingw64/[^ ]*\).*,\1,p' | sort -u) ~/osslsigncode/
    cd
    zip -9r osslsigncode.zip osslsigncode
    

    我在 Visual Studio cmake 构建中使用它没有问题。

    【讨论】:

      【解决方案4】:

      Windows 中有两个证书存储,用户存储和机器存储,您可能将证书安装到本地计算机,或者您在以提升用户身份运行时安装了它。

      【讨论】:

        【解决方案5】:

        首先您遇到这样的错误并且您正在使用 Visual Studio,然后查看项目属性中的签名选项卡。您将看到以前分配的签名(强汇编)

        如果您在此处输入正确的密码:

        如果你的环境和写项目的环境是一样的,会跳过这个错误。查看post关于错误的信息

        这个错误背后的原因是:

        1- 在使用证书文件签署强程序集时,Visual Studio 需要一些功能。

        ClickOnce Manifest Signing and Strong-Name Assembly Signing Using Visual Studio Project Designer's Signing Page

        你可以试试这段代码来确定

        signtool sign /debug /f mypfxfile.pfx /p <password> (mydllexectuable).exe
        

        2- 这些设置可能因机器而异,Windows 默认情况下不会将这些设置写入环境设置。 check the config path

        这部分只是一个深刻的音符!对您应该将私有密钥库文件添加到请求标头的问题不感兴趣,所有这些都是为了这个。我最喜欢的关于在此上创建证书的步骤 post

        【讨论】:

          猜你喜欢
          • 2013-12-14
          • 2017-12-07
          • 2017-12-31
          • 1970-01-01
          • 2023-04-07
          • 2011-09-18
          • 2012-11-22
          • 2016-09-20
          • 2010-11-26
          相关资源
          最近更新 更多