对强命名的 .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 程序集进行数字签名的主要内容,如果未能解决你的问题,请参考以下文章

强命名程序集组成与作用

第三章 共享程序集和强命名程序集

CLR详解CLR中的程序集

转载:.Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法

.Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法

共享程序集和强命名程序集(上)