Authenticode签名 - 仅签署我的程序集

时间:2017-10-12 10:39:13

标签: c# visual-studio msbuild code-signing authenticode

我有一个具有以下结构的.Net解决方案:

  • A.EXE
  • B.DLL
  • thirdParty.dll

我希望Authenticode只签署我自己的二进制文件(a.exe和b.dll)。

我目前在csproj文件上有一个针对a.exe的后期构建事件:

"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /t http://timestamp.globalsign.com/scripts/timestamp.dll /a $(TargetPath)
for %%f in ("$(ProjectDir)$(OutDir)*.dll") do "C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /t http://timestamp.globalsign.com/scripts/timestamp.dll /a $(TargetPath) %%f

然而,这将签署所有dll,包括thirdParty.dll,并且还冒着尝试签署任何未管理的DLL的风险。

现在最简单的解决方案是在bsp的csproj文件上放置一个post-build事件,并删除上面显示的for循环。但是,实际上我们有很多组件,可能会增加更多。我不想依赖其他开发人员记得在Authenticode上添加一个构建后的步骤来签署任何新的程序集。

我可以使用描述here的PowerShell脚本仅对托管程序集进行签名,但在上面的示例中仍然会签署thirdParty.dll。

如何枚举和签署包含我自己代码的程序集?

1 个答案:

答案 0 :(得分:0)

  

如何枚举和签署包含我自己代码的程序集?

您可以使用" if..else if"在循环语句中排除thirdParty.dll

为了测试这个,我用以下构建后事件创建了测试样本:

for %%f in ("$(ProjectDir)$(OutDir)*.dll") do ( if not "%%~nf"=="thirdParty" (echo %%~nf))

您可以使用您的签名命令:

"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign /t http://timestamp.globalsign.com/scripts/timestamp.dll /a $(TargetPath)

而不是测试命令echo %%~nf

此外,如果您有多个需要排除的thirdParty.dll文件,则可以使用叠加的if语句:

for %%f in ("$(ProjectDir)$(OutDir)*.dll") do ( if not "%%~nf"=="thirdParty1" (if not "%%~nf"=="thirdParty2" ( echo %%~nf)))

希望这有帮助。