为什么signtool.exe只能在以管理员身份运行时找到证书?

问题描述 投票:0回答:6

我正在设置一台新的开发笔记本电脑,并安装了自行颁发的代码签名证书。我可以在我当前用户的个人证书下的 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)。我已经能够发现我们系统之间的任何其他差异。

windows certificate code-signing code-signing-certificate signtool
6个回答
4
投票

我今天遇到了这个问题,现在我可以通过命令行运行signtool.exe,而无需提升到管理员权限。

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

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

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

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设置是否相同?


1
投票

我发现自己在使用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 构建中使用它,没有任何问题。


0
投票

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


0
投票

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

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

如果您的环境与项目编写的环境相同,则将跳过此错误。查看有关错误的post

此错误背后的原因是:

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

使用 Visual Studio 项目设计器的签名页面进行 ClickOnce 清单签名和强名称程序集签名

您可以尝试此代码来确定

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

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

检查配置路径

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


0
投票
对我来说,向我的用户添加权限不起作用,因为我找不到我的用户,但它可以向[机器鬃毛]/用户添加权限。我希望它对某人有帮助!

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