Authenticode签名 - 只为我的程序集签名

5
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

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

  • a.exe
  • b.dll
  • thirdParty.dll
我希望对我的二进制文件(a.exe和b.dll)进行Authenticode签名。
我目前在a.exe的csproj文件上有一个后置构建事件:
"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的风险。
现在最简单的解决方案是在csproj文件上放置一个后生成事件用于b.dll,并删除上面显示的for循环。但实际上,我们有许多程序集,可能会添加更多。我不想依赖其他开发人员记住添加后生成步骤来对任何新程序集进行Authenticode签名。
我可以使用此处描述的PowerShell脚本仅签署托管程序集,但仍将在上述示例中签署thirdParty.dll。
如何枚举并签署仅包含自己代码的程序集?
1个回答

1
如何枚举并签署仅包含自己代码的程序集?
您可以在循环语句中使用“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)))

希望这可以帮助到你。


谢谢,但我们依赖于多个第三方库。这个解决方案实际上有相同的问题,即我们需要记住为每个新库手动更新后构建脚本。 - Tom
@Tom,你需要记得手动更新后构建脚本以适应第三方新库,而不是每个新库都要更新。看起来你必须这样做,因为Visual Studio并不聪明到知道哪个dll文件是第三方库。 - Leo Liu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接