有许多站点可以解释如何signtool.exe在.pfx证书文件上运行,该文件归结为:
signtool.exe sign /f mycert.pfx /p mypassword /t http://timestamp.server.com \
/d "My description" file1.exe file2.exe
Run Code Online (Sandbox Code Playgroud)
我有一个持续集成的CI流程设置(使用TeamCity),它像大多数CI流程一样,完成所有工作:检查源代码,编译,签署所有.exes,将软件包签入安装程序,然后签署安装程序.exe.目前有3个构建代理程序,运行相同的VM,其中任何一个都可以运行此过程.
为了实现这一目标,就安全性而言,我做了一些Bad Things(TM):.pfx文件在源代码管理中,并且它的密码在构建脚本中(也在源代码管理中).这意味着任何能够访问源代码存储库的开发人员都可以获取pfx文件并执行他们喜欢的任何恶意内容.(我们是一个相对较小的开发商店,相信每个人都可以访问,但显然这仍然不好).
我能找到"正确"做到这一点,就是你:
虽然我可以看到这个安全性的优点..这是一个非常繁重的过程,并且在时间方面很昂贵(运行此过程,安全地保留证书备份,确保代码签名机器处于工作状态等) ).
我确信有些人会跳过步骤,只需手动签署存储在他们个人系统上的证书的文件,但这仍然不是很好.
它也与安装程序中使用的签名文件(也由构建服务器构建)不兼容 - 当您安装了具有UAC提示以获得管理员访问权限的.exe时,这一点很重要.
我更关心的是没有向用户提供可怕的"不受信任的应用程序"UAC提示,而不是证明它是我的公司.同时,将私钥和密码存储在每个开发人员(以及QA和高级技术支持)都可以访问的源代码存储库中显然不是一个好的安全实践.
我想要的是CI服务器在构建过程中仍然像今天一样签名,但没有密码(或证书的私钥部分)可供访问源代码存储库的每个人访问.
有没有办法将密码保留在构建之外或以某种方式保护?我应该告诉signtool使用证书存储区(我如何使用3个构建代理程序和构建作为非交互式用户帐户运行)?别的什么?
teamcity continuous-integration code-signing authenticode signtool
我几个月来一直在为编译的应用程序签名,并且有一个调用 Windows 10 SDK 签名工具的脚本。它在两台不同的计算机上运行良好,我的证书有效。今天,我刚刚开始收到带有上面列出的错误编号的“意外内部错误”。我尝试禁用防病毒软件,这在这种情况下有所帮助,但对我的无效。
我的应用程序是用 Delphi 编写的,但我认为这并不重要,因为在 Visual Studio 下的Microsoft开发人员社区上报告了同样的问题。我一直在使用 SDK 的 10.0.18362.0 版,但在收到此错误后,发现有更新并尝试使用 10.0.19041.0 版但出现相同的错误。
还有其他人有这个问题吗?有什么建议?
我正在尝试签署我的clickonce应用程序.我有一个使用SHA256的EV代码签名证书.问题是,当我使用post build命令签署我的应用程序时,它似乎使用SHA1而不是SHA256.这是输出窗口的剪辑:
Running Code Analysis...
1> Code Analysis Complete -- 0 error(s), 0 warning(s)
1> The following certificate was selected:
1> Issued to: Certificate Subject Name Here
1>
1> Issued by: DigiCert EV Code Signing CA (SHA2)
1>
1> Expires: Thu Apr 14 06:00:00 2016
1>
1> SHA1 hash: HASH-HERE
1>
1>
1> Done Adding Additional Store
1> Successfully signed and timestamped: C:\Users\AnyBody\Documents\Visual Studio 2013\Projects\My Project\Project Folder\obj\x86\My Configuration\MyProgram.exe
1>
1>
1> Number of files successfully Signed: 1
1>
1> Number …Run Code Online (Sandbox Code Playgroud) 在Inno Setup中是否可以同时使用sha1和sha256对Uninstaller和Installer进行签名?
我有一个自签名代码签名证书(使用此答案中的说明制作),当我使用时它可以正常工作signtool.exe.但是,如果我尝试使用Powershell进行签名,则会失败.
用signtool签名
C:\>signtool sign /v /n "VetWeb" SetupRDPPermissions.ps1
The following certificate was selected:
Issued to: VetWeb
Issued by: VetWeb CA
Expires: Sat Dec 31 18:59:59 2039
SHA1 hash: 84136EBF8D2603C2CD6668C955F920C6C6482EE4
Done Adding Additional Store
Successfully signed: SetupRDPPermissions.ps1
Number of files successfully Signed: 1
Number of warnings: 0
Run Code Online (Sandbox Code Playgroud)
登录Powershell
PS C:\> $cert = @(Get-Childitem cert:\CurrentUser\My | Where-Object -FilterScript {$_.Subject -eq 'CN=VetWeb'})[0]
PS C:\> Set-AuthenticodeSignature SetupRDPPermissions.ps1 $cert
Set-AuthenticodeSignature : Cannot sign code. The specified certificate is not suitable for …Run Code Online (Sandbox Code Playgroud) 我正在分析现有的Windows应用商店应用程序并对其进行修改,以确保我公司的混淆器可以与它们配合使用.
尽管如此,我遇到了一些问题.我可以轻松地从商店中获取APPX包(要求Fiddler获取URL).然后我可以使用任何解压缩程序将appx解压缩到一个文件夹.然后,我可以在APPX中获取程序集并稍微修改IL.然后我重新制作并签署包裹:
makeappx pack /d "mypackage" /p "mypackage.appx"
signtool sign /fd sha256 /f temporarykey.pfx mypackage.appx
Run Code Online (Sandbox Code Playgroud)
然后,我在signtool中遇到错误:
SignTool Error: An unexpected internal error has occured
Error information: "Error: SignerSign() failed." (-2147024885/0x800700b)
Run Code Online (Sandbox Code Playgroud)
当然,当尝试使用Visual Studio创建的标准powerscript文件安装它来安装/侧载任何APPX包时,会遇到错误.
Found package: C:\....mypackage.appx
Error: The package is not digitally signed or its signature is corrupted
Run Code Online (Sandbox Code Playgroud)
我已经将这个精确的过程用于从Visual Studio生成的包.临时密钥是否绑定到特定包或其他东西?我错过了什么?这是signtool中的错误吗?
我想自动化一些ClickOnce部署工件的代码签名 - 应用程序exe和清单.我正在使用signtool来实现这一目标.为了使私钥可用于签名并保护包含私钥(.pfx文件)的证书文件,我的计划是使用不可导出的密钥将证书安装到本地计算机证书存储中.(我知道有一些方法可以导出密钥,即使它被标记为不可导出.)该机器是一个持续集成服务器,只有少数人可以访问.我希望以这样一种方式进行设置,即只要需要使用私钥,就需要输入私钥密码.然后我会设置一个自动作业(使用Jenkins),这需要一个可以收集私钥密码的构建参数.该面具密码插件将被用来掩盖同时进入,并在控制台输出的密码.
但是,我遇到了几个障碍.首先,即使存在"启用强私钥保护.如果启用此选项,每次应用程序使用私钥时都会提示您." 导入证书时,它似乎仅在将其导入当前用户存储而不是本地计算机存储时可用.其次,即使此选项可用,在使用商店中的证书进行签名时,signtool工具也不提供设置密码的选项.密码参数'/ p'仅在使用pfx文件作为私钥源('/ f'选项)时适用.鉴于此,这似乎不是一个可行的选择.注意:即使"启用强私钥保护".可用于机器商店中的证书,我的测试表明,尝试使用带有此选项的证书只会弹出一个对话框,要求获得使用它的权限,这显然不适用于自动化作业.我原本以为"提示"意味着它会要求输入密码.
我考虑过的另一个选择是创建ACL以保护证书存储中的私钥.这可以通过右键单击证书并选择All Tasks ... |来完成 管理私钥...对话框.这会将私钥使用限制为仅限授权.(注意:当没有私钥权限的用户尝试使用它进行签名时,他们会收到消息"SignTool错误:找不到符合所有给定条件的证书.")但是,我不想提供访问权限到Jenkins构建服务使用的凭据,因为任何构建作业都可以签署代码.我可以创建一个作业来执行脚本以作为特定用户运行签名命令.这需要将域用户名和密码作为构建参数.我可以使用Jenkins Mask Passwords插件来做到这一点.但是,我并不喜欢这样,因为我不满意掩码密码足以防止暴露域凭证,如果受到破坏,它将提供比私钥更多的访问权限.
如果我放弃了将证书存储在计算机存储中的原始想法,可以选择将证书pfx文件放在构建计算机上的ACL安全文件夹中,只有构建过程和签名用户具有权限.这样做可以让我创建一个构建作业来使用包含的私钥,同时不将文件暴露给有权访问该机器的其他人.要使用私钥,构建参数需要收集私钥密码.
最后,可以选择使用智能卡存储证书,但我们已经决定反对.
所以,我的问题是,有没有其他方法可以做到这一点1)保护私钥不被复制,2)防止私钥被未授权用户用于签署代码和3),给定私钥密码是由授权用户提供,使用构建服务进行签名的私钥?
我正在使用signtool来编写一些Windows安装文件和应用程序可执行文件的代码.我正在使用的命令是:
signtool sign /f "\path\to\certfile.pfx" /p "certPassword" /tr http://tsa.starfieldtech.com /td SHA256 "path\to\setup.exe"
Run Code Online (Sandbox Code Playgroud)
该/tr选项使签名带有指定时间戳服务器的时间戳.所述/td指定摘要算法(散列函数).
此命令通常由我们的一个远程服务器上的自动代码签名作业执行.该作业签署了22个不同的可执行文件,其中一半是安装文件,另一半是应用程序可执行文件.通常,在签名作业的某个时刻,命令在其中一个文件上失败.它并不总是一种或其他类型的exe,它发生在两种类型上.错误是:
Done Adding Additional Store
Error information: "SignerTimeStampEx2() failed." (-2146881278/0x80093102)
SignTool Error: An unexpected internal error has occurred.
Sign command failed with exit code 1.
Run Code Online (Sandbox Code Playgroud)
在MSDN文档指出0x80093102代码的意思是:
CRYPT_E_ASN1_EOD - ASN1 unexpected end of data.
Run Code Online (Sandbox Code Playgroud)
我检查了服务器的Windows事件日志,但没有找到任何相关消息.
我重新运行该作业,它有时会在不同的exe上失败,有时它会成功签署所有文件.请注意,作业不会重建exe,它每次都使用相同的源exe.我使用相同的可执行文件多次在本地运行同一个作业,从未遇到过问题.它似乎只有当我从远程服务器运行时.基于这个事实,记录的错误信息和结果代码说明的文本,听起来好像是连接到时间戳服务器时遇到问题,或者在与服务器通信时出错.
这个错误究竟是什么意思,我该如何解决这个问题?
更新:我修改了我的签名脚本,以便在该exe失败时重试单个exe的签名最多五次.在本地计算机上测试更改时,我实际遇到了同一错误的实例,表明它不仅仅是远程服务器上的问题.假设这只是联系时间戳服务器的失败,这可能是我最好的选择.但是,我仍然想知道错误的确切原因是什么.
我在Visual Studio 2013中有一个C#/ .NET 4.5 x64项目.不止一个开发人员在这个项目上工作,因此代码在Git中管理.我登录编译.dllS和.exe带signtool.exe.我的公司购买了代码签名证书,如果我从命令行手动签名,如下所示:
signtool.exe sign /f cert.p12 /p "password" "compiled.dll"
Run Code Online (Sandbox Code Playgroud)
...然后看起来一切都很棒:我得到了一条成功消息,Windows资源管理器中已编译DLL的属性显示为正确签名.所以,我对实际的签名过程没有任何问题.
但是,证书及其密码不得存在于Git中.它们将在项目的所有开发人员之外提供.我可以假设每个开发人员在构建项目时都会将证书存储在他计算机上的预定义位置,并且他将知道密码.
所以,这是我的问题:如何配置Visual Studio 2013以自动签署其编译输出而不保留Git中的证书或密码?我希望它一样简单,一旦开发人员在预定义路径(或导入,或其他)中拥有证书,并假设开发人员知道证书的密码,在Visual Studio中单击"构建" 2013只是建立和签署它,没有问题.
如果签名过程可以是非交互式的(没有密码提示),那就是奖金.最终,这将是可以签署其输出的持续集成(CI)服务器的一部分,并且因为它是自动的,所以没有人会输入密码.但是,我现在会采取任何解决方案.
我的证书是PKCS#12格式,并受密码保护.Windows声称它没有标记为导出.
编辑
事件日志错误是这样的:
error 0x8007000B: The app manifest publisher name (CN=...)
must match the subject name of the signing certificate
(CN={19BE29DF-4812-4F2E-8FC1-A138B146946A}).
Run Code Online (Sandbox Code Playgroud)
现在看来下面的命令似乎有效.因此,当我看到这个时,无论是我无法识别的用户错误还是与机器状态有关的东西.与事件日志消息中的签名证书关联的guid不是证书管理器管理单元中显示的证书,这很奇怪.
原始问题
我正在尝试签署使用生成的UWP appx包MakeAppx.exe.pfx是使用https://msdn.microsoft.com/windows/uwp/porting/desktop-to-uwp-manual-conversion这些命令生成的开发人员代码签名证书.
C:\> MakeCert.exe -r -h 0 -n "CN=<publisher_name>" -eku 1.3.6.1.5.5.7.3.3 -pe -sv <my.pvk> <my.cer>
C:\> pvk2pfx.exe -pvk <my.pvk> -spc <my.cer> -pfx <my.pfx>
Run Code Online (Sandbox Code Playgroud)
私钥位于我受信任的根证书存储区中,并且在我使用Desktop App Converter从安装程序生成appx时工作.
我使用的命令行是:
signtool.exe sign -f <path to my pfx file> -fd SHA256 -v .\FishTank.appx
Run Code Online (Sandbox Code Playgroud)
但是SignTool错误的是:
The following certificate was selected:
Issued to: ...
Issued by: …Run Code Online (Sandbox Code Playgroud) signtool windows-store-apps appx desktop-app-converter desktop-bridge
signtool ×10
code-signing ×6
certificate ×2
appx ×1
authenticode ×1
c# ×1
clickonce ×1
delphi ×1
inno-setup ×1
jenkins ×1
package ×1
powershell ×1
security ×1
sha1 ×1
sha256 ×1
teamcity ×1
verisign ×1
windows-8 ×1