对强命名的 .NET 程序集进行数字签名
Posted
技术标签:
【中文标题】对强命名的 .NET 程序集进行数字签名【英文标题】:Digitally signing a strong named .NET assembly 【发布时间】:2015-05-08 11:07:44 【问题描述】:我有一个强烈命名的 .NET 程序集,将其放入 GAC。但是,稍后也会使用 .pfx
文件对同一程序集进行数字签名,以进行数字签名。
我注意到这个经过双重签名的程序集未能通过强名称验证,并且没有安装在目标机器的 GAC 中。
数字签名程序是否有可能删除 SN 密钥生成的强命名程序?
数字签名是必不可少的,如果两者不兼容,那么文件是否可以由.pfx
文件代替,就像SN命名过程一样容易?
此外,程序集位于C++/CLI
,而不是C#
。
编辑:查看MSDN Documentation,它说是否使用链接器选项进行强命名,以及是否使用像mt.exe
这样的后处理工具(我不确定Signtool.exe
是否属于在这些工具中),程序集需要退出。
另外,这个声明:
如果您在开发环境中构建时使用签名属性,则可以通过在构建后事件中显式调用 sn.exe (Sn.exe (强名称工具)) 来成功签署程序集。
...有点混乱。它指的是哪些属性,CLR
属性或Linker
选项?
【问题讨论】:
【参考方案1】:它们是兼容的,应按特定顺序应用:
-
强名称 (sn.exe)
验证码/代码签名/数字签名 (signtool.exe)
我经常这样做,对 C# 程序集没有任何问题。我不知道这对于 c++ 会有所不同。
之所以有效,是因为强名称哈希码不包括 PE 标头的某些部分,包括验证码哈希。正如这里所解释的here。
【讨论】:
查看文档,它说,如果在构建后使用像 mt.exe 这样的后处理工具,则应使用 SN 工具重新签署程序集。我正在使用链接器选项对程序集进行签名。在构建的(和强名称签名的)程序集上使用 signtool.exe 后,它失去了它的强名称属性......与 VC++ 构建环境有关 - msdn.microsoft.com/en-us/library/vstudio/… ?这似乎特定于 CLI。在这种情况下,我应该如何处理?【参考方案2】:我们构建了一些 C++/CLI 程序集。我们使用链接器开关:
/KEYFILE - 使用公钥选择 snk 文件 /DELAYSIGN - 指定延迟签名然后,在构建后事件中,我们调用 sn.exe 来应用测试签名
稍后,就在将程序集包含在合并模块中之前,我们调用:
sn.exe - 应用真正的强名称签名 signtool.exe - 应用 Authenticode 签名您应该可以只使用 /KEYFILE 来指定保存您的密钥对的 snk 文件,然后只需调用 signtool 来进行 Authenticode 签名。
除非您使用其他一些后期构建工具,否则应该这样做。
【讨论】:
以上是关于对强命名的 .NET 程序集进行数字签名的主要内容,如果未能解决你的问题,请参考以下文章
转载:.Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法