我正在安装一台新的开发笔记本电脑,并安装了自发的代码签名证书。我可以在certmgr中的“当前用户的个人证书”下看到它。
当我尝试从Visual Studio 2017的开发人员命令提示符进行构建时,我得到:
error : SignTool Error: No certificates were found that met all the given criteria.
这在我的旧笔记本电脑上总是可以正常工作。
我发现如果我以管理员身份启动后从命令提示符运行相同的构建,则signtool成功并可以找到证书。
当我们设置新笔记本电脑时,这发生在3/4同事身上。一个人没事,可以不以管理员身份运行即可签名。在我们的旧笔记本电脑上,我们无需以管理员身份运行。
我尝试使用Google搜索来查找可能的原因,因为我不知道是否以admin身份运行对此没有任何影响。我还没有找到关于这个问题的参考。
如何在不以管理员身份运行的情况下使用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)。我已经能够发现我们系统之间的其他差异。
答案 0 :(得分:1)
我今天遇到了这个问题,这就是我现在能够通过命令行运行signtool.exe而无需提升为管理员的方式。
答案 1 :(得分:0)
Windows中有两个证书存储,一个是用户存储,另一个是计算机存储,您可能将证书安装到了本地计算机上,或者在以提升用户身份运行时安装了证书。
答案 2 :(得分:0)
首先,您会收到这样的错误,并且您正在使用Visual Studio,然后查看项目属性中的签名选项卡。您将看到一个先前分配的签名(强装配)
如果您在此处输入正确的密码:
如果您的环境与编写项目的环境相同,则将跳过此错误。查看post关于错误的信息
此错误的原因是:
1-使用证书文件签署强程序集时,Visual Studio需要一些功能。
您可以尝试使用以下代码来确定
signtool sign /debug /f mypfxfile.pfx /p <password> (mydllexectuable).exe
2-这些设置因机器而异,并且Windows默认情况下不会将这些设置写入环境设置。 check the config path
这部分只是一个很深的说明!对这个问题不感兴趣,您应该将您的私有密钥库文件添加到请求标头以及所有这些。我最喜欢的步骤是在此{em> post
上创建证书答案 3 :(得分:0)
类似于@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"
}
})
}
})
请记住,如果您以普通用户身份运行并以admin身份运行,则上述输出可能会略有不同。
最后,您和您的同事的UAC设置是否相同?
答案 4 :(得分:0)
我发现自己在使用signtool时也遇到类似的情况,它拒绝与admin用户一起使用,但确实以实际的Administrator身份工作。
就我而言,我实际上并不是将证书导入证书存储中,而是使用从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版本中使用它,没有问题。