创建和使用具有强名称的程序集

强名称是由程序集的标识加上公钥和数字签名组成的。其中,程序集的标识包括简单文本名称、版本号和区域性信息(如果提供的话)。 它使用对应的私钥从程序集文件中生成。 (程序集文件包含程序集清单,其中包含组成程序集的所有文件的名称和哈希。)

具有强名称的程序集只能使用其他具有强名称的程序集的类型。 否则会危及具有强名称的程序集的安全。

本概述包含以下几节:

  • 强名称方案

  • 跳过受信任程序集的签名验证

  • 相关主题

强名称方案

下面的方案说明了使用强名称对程序集签名及以后按照该名称引用它的过程。

  1. 使用以下方法之一创建强名称程序集 A:

    • 使用支持创建强名称的开发环境(如 Visual Studio 2005)。

    • 使用强名称工具 (Sn.exe) 创建加密密钥对,并使用命令行编译器或程序集链接器 (Al.exe) 将该密钥对分配给程序集。 Windows 软件开发包 (SDK) 提供了 Sn.exe 和 Al.exe。

  2. 开发环境或工具使用开发人员私钥对包含程序集清单的文件哈希签名。 该数字签名存储在包含程序集 A 的清单的可迁移可执行 (PE) 文件中。

  3. 程序集 B 是程序集 A 的使用者。 程序集 B 的清单的引用部分包括代表程序集 A 公钥的标记。 标记是完整公钥的一部分,并且这种标记(而不是密钥本身)可用于节省空间。

  4. 公共语言运行时在程序集放在全局程序集缓存时验证强名称签名。 当在运行时通过强名称进行绑定时,公共语言运行时会将存储在程序集 B 的清单中的密钥与用于为程序集 A 生成强名称的密钥进行比较。 如果 .NET Framework 安全检查通过并且绑定成功,则程序集 B 可保证程序集 A 的位未被篡改,而这些位实际来自程序集 A 的开发人员。

注意注意

此方案不处理信任问题。除了强名称以外,程序集还可携带完整的 Microsoft Authenticode 签名。Authenticode 签名包括建立信任的证书。请注意,强名称不要求以这种方式为代码签名,这一点非常重要。事实上,用于生成强名称签名的密钥不必与用于生成 Authenticode 签名的密钥相同。

返回页首

跳过受信任程序集的签名验证

从 .NET Framework 3.5 版 Service Pack 1 开始,当程序集载入完全信任应用程序域(例如 MyComputer 区域的默认应用程序域)中时,将不会验证强名称签名。 这称为强名称跳过功能。 在完全信任环境中,对于已签名的完全信任程序集,无论这些程序集的签名是什么,对 StrongNameIdentityPermission 的要求将总是成功。 强名称跳过功能避免了在此情况下验证完全信任程序集的强名称签名所带来的不必要开销,从而可使程序集更快加载。

该跳过功能适用于用强名称签名并具有以下特征的任何程序集:

  • 完全受信任而没有 StrongName 证据(例如,具有 MyComputer 区域证据)。

  • 加载到完全受信任的 AppDomain 中。

  • 从该 AppDomainApplicationBase 属性下的位置加载。

  • 未经延迟签名。

可以对单独的应用程序或整个计算机禁用此功能。 请参见如何:禁用强名称跳过功能

返回页首

相关主题

标题

说明

如何:创建公钥/私钥对

描述如何创建用于对程序集签名的密钥对。

如何:使用强名称为程序集签名

描述如何创建具有强名称的程序集。

如何:引用具有强名称的程序集

描述如何在编译时或运行时引用具有强名称的程序集中的类型或资源。

如何:禁用强名称跳过功能

描述如何禁用用于跳过强名称签名验证的功能。 可以对所有应用程序或特定的应用程序禁用此功能。

创建程序集

提供单文件和多文件程序集的概述。

如何:延迟为程序集签名 (Visual Studio)

解释如何在创建程序集后使用强名称对该程序集签名。

Sn.exe(强名称工具)

描述 .NET Framework 中包含的可帮助创建具有强名称的程序集的工具。 此工具提供有关密钥管理、签名生成和签名验证的选项。

Al.exe(程序集链接器)

描述 .NET Framework 中包含的一项工具,此工具从模块或资源文件中生成具有程序集清单的文件。

返回页首