为什么 signtool.exe 仅在 运行 作为管理员时才能找到证书?
Why does signtool.exe only find certificate when run as admin?
我正在设置一台新的开发笔记本电脑,并安装了一个自行颁发的代码签名证书。我可以在当前用户的个人证书下的 certmgr 中看到它。
当我尝试从 Visual Studio 2017 的开发人员命令提示构建时,我得到:
error : SignTool Error: No certificates were found that met all the given criteria.
这在我的旧笔记本电脑上一直运行良好。
我发现如果我 运行 以管理员身份 在命令提示符下启动相同的构建 signtool 成功并且可以找到证书。
在我们设置新笔记本电脑时,3/4 的同事遇到过这种情况。一个人没问题,可以在没有 运行ning 作为管理员的情况下签名。在我们的旧笔记本电脑上,我们从来不需要 运行 作为管理员。
我尝试使用谷歌搜索来查找可能的原因,因为我不知道 运行宁是否作为管理员应该对此有任何影响。我还没有找到任何关于这个问题的参考资料。
我们如何使用 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 中有两个证书存储、用户存储和一个机器存储,您可能将证书安装到本地计算机,或者您在 运行 作为提升用户时安装了它。
首先你得到了这样的错误并且你正在使用 visual studio 然后查看项目属性中的签名选项卡。你会看到一个之前分配的签名(强集)
如果您在这里输入正确的密码:
如果你的环境和写项目的环境一样,会跳过这个错误。查看 post 关于错误
此错误背后的原因是:
1- Visual Studio 在使用证书文件签署强程序集时需要一些功能。
你可以试试这个代码来判断
signtool sign /debug /f mypfxfile.pfx /p <password> (mydllexectuable).exe
2- 这些设置可能因机器而异,并且 windows 默认情况下不会将这些设置写入环境设置。 check the config path
这部分只是深度笔记!对这个问题不感兴趣,你应该添加你的私人密钥库文件来请求 header 以及所有这些。关于在此创建证书的我最喜欢的步骤 post
与@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"
}
})
}
})
请记住,如果您 运行 作为普通用户和 'run as admin'.
,上述输出可能会略有不同
最后,您和您同事的 UAC 设置是否相同?
我今天 运行 进入了这个,这就是我现在如何通过命令行 运行 signtool.exe 而无需提升到管理员权限。
- 运行 'mmc' 并添加 'Certificates' 管理单元
- Select 正确的密钥存储位置
- (我的在本地电脑,所以我在这里 select 'Computer account')
- 查找并select证书
- 右键单击证书,select所有任务 > 管理私钥...
- 在 'Permissions for private keys' 对话框中,添加您的用户帐户,然后给自己 'Full Control'。您现在可以使用普通的命令提示符进行签名。
- 注意:如果您使用构建机器,请对执行构建的帐户执行上述步骤。
我发现自己在使用 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/[^ ]*\).*,,p' | sort -u) ~/osslsigncode/
cd
zip -9r osslsigncode.zip osslsigncode
我在 Visual Studio cmake 构建中使用它没有问题。
我正在设置一台新的开发笔记本电脑,并安装了一个自行颁发的代码签名证书。我可以在当前用户的个人证书下的 certmgr 中看到它。
当我尝试从 Visual Studio 2017 的开发人员命令提示构建时,我得到:
error : SignTool Error: No certificates were found that met all the given criteria.
这在我的旧笔记本电脑上一直运行良好。
我发现如果我 运行 以管理员身份 在命令提示符下启动相同的构建 signtool 成功并且可以找到证书。
在我们设置新笔记本电脑时,3/4 的同事遇到过这种情况。一个人没问题,可以在没有 运行ning 作为管理员的情况下签名。在我们的旧笔记本电脑上,我们从来不需要 运行 作为管理员。
我尝试使用谷歌搜索来查找可能的原因,因为我不知道 运行宁是否作为管理员应该对此有任何影响。我还没有找到任何关于这个问题的参考资料。
我们如何使用 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 中有两个证书存储、用户存储和一个机器存储,您可能将证书安装到本地计算机,或者您在 运行 作为提升用户时安装了它。
首先你得到了这样的错误并且你正在使用 visual studio 然后查看项目属性中的签名选项卡。你会看到一个之前分配的签名(强集)
如果您在这里输入正确的密码:
如果你的环境和写项目的环境一样,会跳过这个错误。查看 post 关于错误
此错误背后的原因是:
1- Visual Studio 在使用证书文件签署强程序集时需要一些功能。
你可以试试这个代码来判断
signtool sign /debug /f mypfxfile.pfx /p <password> (mydllexectuable).exe
2- 这些设置可能因机器而异,并且 windows 默认情况下不会将这些设置写入环境设置。 check the config path
这部分只是深度笔记!对这个问题不感兴趣,你应该添加你的私人密钥库文件来请求 header 以及所有这些。关于在此创建证书的我最喜欢的步骤 post
与@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"
}
})
}
})
请记住,如果您 运行 作为普通用户和 'run as admin'.
,上述输出可能会略有不同最后,您和您同事的 UAC 设置是否相同?
我今天 运行 进入了这个,这就是我现在如何通过命令行 运行 signtool.exe 而无需提升到管理员权限。
- 运行 'mmc' 并添加 'Certificates' 管理单元
- Select 正确的密钥存储位置
- (我的在本地电脑,所以我在这里 select 'Computer account')
- 查找并select证书
- 右键单击证书,select所有任务 > 管理私钥...
- 在 'Permissions for private keys' 对话框中,添加您的用户帐户,然后给自己 'Full Control'。您现在可以使用普通的命令提示符进行签名。
- 注意:如果您使用构建机器,请对执行构建的帐户执行上述步骤。
我发现自己在使用 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/[^ ]*\).*,,p' | sort -u) ~/osslsigncode/
cd
zip -9r osslsigncode.zip osslsigncode
我在 Visual Studio cmake 构建中使用它没有问题。