管理程序集和清单签名

强名称签名可为软件组件提供全局唯一标识。 使用强名称可保证程序集不被其他用户伪造,还可确保组件依赖关系和配置语句映射到正确的组件和组件版本。

强名称是由程序集的标识加上公钥令牌和数字签名组成的。其中,程序集的标识包括简单文本名称、版本号和区域性信息。

有关 Visual Basic 和 C# 项目中签名程序集的信息,请参阅创建和使用具有强名称的程序集

有关 C++ 项目中签名程序集的信息,请参阅强名称程序集 (C++/CLI)

注意

强名称签名不能保护程序集免受反向工程的威胁。 若要防止反向工程,请参阅 Dotfuscator Community

资产类型和签名

可对 .NET 程序集和应用程序清单进行签名:

  • 可执行文件 (.exe)

  • 应用程序清单 (.exe.manifest)

  • 部署清单 (.application)

  • 共享组件程序集 (.dll)

对以下类型的资产进行签名:

  1. 程序集,如果想要将它们部署到全局程序集缓存 (GAC)。

  2. ClickOnce 应用程序和部署清单。 Visual Studio 默认情况下将启动对这些应用程序的签名。

  3. 主互操作程序集,适用于 COM 互操作性。 从 COM 类型库中创建主互操作程序集时,TLBIMP 实用程序将强制实施强命名。

通常不应该对可执行文件进行签名。 强命名组件无法引用与应用程序一同部署的非强命名组件。 Visual Studio 不会对应用程序可执行文件进行签名,但会对指向弱命名可执行文件的应用程序清单进行签名。 避免对应用程序专用的组件进行签名,因为签名可能增加管理依赖项的难度。

如何对 Visual Studio 中的程序集进行签名

对程序集进行签名的过程取决于项目使用的项目设计器的版本。

对于 Visual Studio 2022 中的 .NET Core(和 .NET 5 及更高版本)C# 项目:

  1. 打开项目属性窗口(右键单击“解决方案资源管理器”中的项目节点,然后选择“属性”)。
  2. 在“生成”下,查找“强命名”,然后选择“对程序集签名”复选框。 选中该框时,将显示密钥文件和延迟签名的其他选项。
  3. 指定密钥文件。

如果没有密钥文件,则可使用命令行来创建 .snk 文件。 此外,还可使用发布流程在 .pfx 文件中使用或生成一个证书;而在对清单签名步骤中,则可创建一个测试证书,以便在开发和测试期间使用它,或是使用 IT 部门或授权源颁发的证书以将其用于生产。 请参阅使用 ClickOnce 部署 .NET Windows 桌面应用

对于 Visual Studio 2022 或 Visual Studio 2019 中的 .NET Framework 和 Visual Basic 项目:

  1. 打开项目属性窗口的“签名”选项卡(右键单击“解决方案资源管理器”中的项目节点,然后选择“属性”)。 选择“签名”选项卡。
  2. 选择为程序集签名复选框。
  3. 指定密钥文件。 如果选择新建密钥文件,始终以 .pfx 格式创建新密钥文件。 需要为新文件设置名称和密码。

警告

应始终使用密码保护密钥文件,以防他人使用。 还可以使用提供程序或证书存储来保护密钥。

也可以指向已创建的密钥。 有关创建密钥的详细信息,请参阅创建公钥/私钥对

如果仅对公钥具有访问权限,可以使用延迟签名来推迟分配密钥。 可通过选择“仅延迟签名”复选框来启用延迟签名。 延迟签名的项目将不会运行,并且无法调试。 但是,可以通过 Sn.exe 强名称工具-Vr 选项,在开发过程中跳过验证。

有关对清单签名的详细信息,请参阅如何:对应用程序和部署清单签名