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

Tom*_*Tom 5 c# msbuild code-signing authenticode visual-studio

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

  • 执行程序
  • dll
  • 第三方.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
Run Code Online (Sandbox Code Playgroud)

但是,这将对包括thirdParty.dll 在内的所有dll 进行签名,并且还存在尝试对任何非托管DLL 进行签名的风险。

现在,最简单的解决方案是在 b.dll 的 csproj 文件上放置一个构建后事件,并删除上面所示的 for 循环。然而,实际上我们有许多组件,并且可能会添加更多组件。我不想依赖其他开发人员记得添加构建后步骤来对任何新程序集进行 Authenticode 签名。

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

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

Leo*_*SFT 1

\n

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

\n
\n\n

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

\n\n

为了测试这一点,我使用以下构建后事件创建了测试示例:

\n\n
for %%f in ("$(ProjectDir)$(OutDir)*.dll") do ( if not "%%~nf"=="thirdParty" (echo %%~nf))\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以使用您的签名命令\xef\xbc\x9a

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

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

\n\n

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

\n\n
for %%f in ("$(ProjectDir)$(OutDir)*.dll") do ( if not "%%~nf"=="thirdParty1" (if not "%%~nf"=="thirdParty2" ( echo %%~nf)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

希望这可以帮助。

\n