小编Ron*_*aff的帖子

自动代码签名 - 保护私钥

我想自动化一些ClickOnce部署工件的代码签名 - 应用程序exe和清单.我正在使用signtool来实现这一目标.为了使私钥可用于签名并保护包含私钥(.pfx文件)的证书文件,我的计划是使用不可导出的密钥将证书安装到本地计算机证书存储中.(我知道有一些方法可以导出密钥,即使它被标记为不可导出.)该机器是一个持续集成服务器,只有少数人可以访问.我希望以这样一种方式进行设置,即只要需要使用私钥,就需要输入私钥密码.然后我会设置一个自动作业(使用Jenkins),这需要一个可以收集私钥密码的构建参数.该面具密码插件将被用来掩盖同时进入,并在控制台输出的密码.

但是,我遇到了几个障碍.首先,即使存在"启用强私钥保护.如果启用此选项,每次应用程序使用私钥时都会提示您." 导入证书时,它似乎仅在将其导入当前用户存储而不是本地计算机存储时可用.其次,即使此选项可用,在使用商店中的证书进行签名时,signtool工具也不提供设置密码的选项.密码参数'/ p'仅在使用pfx文件作为私钥源('/ f'选项)时适用.鉴于此,这似乎不是一个可行的选择.注意:即使"启用强私钥保护".可用于机器商店中的证书,我的测试表明,尝试使用带有此选项的证书只会弹出一个对话框,要求获得使用它的权限,这显然不适用于自动化作业.我原本以为"提示"意味着它会要求输入密码.

我考虑过的另一个选择是创建ACL以保护证书存储中的私钥.这可以通过右键单击证书并选择All Tasks ... |来完成 管理私钥...对话框.这会将私钥使用限制为仅限授权.(注意:当没有私钥权限的用户尝试使用它进行签名时,他们会收到消息"SignTool错误:找不到符合所有给定条件的证书.")但是,我不想提供访问权限到Jenkins构建服务使用的凭据,因为任何构建作业都可以签署代码.我可以创建一个作业来执行脚本以作为特定用户运行签名命令.这需要将域用户名和密码作为构建参数.我可以使用Jenkins Mask Passwords插件来做到这一点.但是,我并不喜欢这样,因为我不满意掩码密码足以防止暴露域凭证,如果受到破坏,它将提供比私钥更多的访问权限.

如果我放弃了将证书存储在计算机存储中的原始想法,可以选择将证书pfx文件放在构建计算机上的ACL安全文件夹中,只有构建过程和签名用户具有权限.这样做可以让我创建一个构建作业来使用包含的私钥,同时不将文件暴露给有权访问该机器的其他人.要使用私钥,构建参数需要收集私钥密码.

最后,可以选择使用智能卡存储证书,但我们已经决定反对.

所以,我的问题是,有没有其他方法可以做到这一点1)保护私钥不被复制,2)防止私钥被未授权用户用于签署代码和3),给定私钥密码是由授权用户提供,使用构建服务进行签名的私钥?

security code-signing certificate signtool jenkins

10
推荐指数
1
解决办法
3289
查看次数

SignerTimeStampEx2()失败

我正在使用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的签名最多五次.在本地计算机上测试更改时,我实际遇到了同一错误的实例,表明它不仅仅是远程服务器上的问题.假设这只是联系时间戳服务器的失败,这可能是我最好的选择.但是,我仍然想知道错误的确切原因是什么.

code-signing certificate signtool

10
推荐指数
0
解决办法
2780
查看次数

标签 统计

certificate ×2

code-signing ×2

signtool ×2

jenkins ×1

security ×1