什么是程序集签名?为什么要这样做?
最简单的签名方式是什么?.snk文件有什么作用?
另外两个答案都很好,但还有一个补充点。容易混淆“证书”签名和“强名称”签名。
强名称签名的目的是如Stefan Steinegger所说:让客户确定他们认为正在加载的代码确实是他们正在加载的代码。这就是所有强名称的用途。具体来说,强名称不会建立您和客户之间的任何信任关系。如果客户决定信任来自您的代码,那么他们需要找出您代码的正确强名称。 “密钥管理”问题并没有得到任何解决;客户负责找出如何知道要信任哪个密钥。
证书签名,即使用从Verisign或其他认证机构获得的证书进行签名,具有更复杂的目的。证书签名的目的是建立一个经过身份验证的信任链和身份,从认证机构到签署代码的组织。您的客户可能不信任您,您的客户甚至可能听都没听说过您,但是您的客户可以说“如果Verisign对作者的身份进行了担保,那么我就信任它们”。密钥管理问题对于客户来说减轻了,因为认证机构已经承担了这个负担。
签名程序集就是给程序集一个强名称。
首先,让我们进行一个重要的区分。在.NET中,将程序集分类的一种方式如下:
为什么要这么做?拥有强名称可以保证您的程序集是独一无二的,没有人能够窃取GUID(如COM)以创建具有相同名称的不同对象。换句话说,您确保加载已签名的程序集时正在加载您认为应该加载的内容。Eric Lippert在这里对这个问题提供了一个很好的答案。
这并不意味着签名的程序集可信任。为此,程序集可以包含Authenticode,一种数字签名,以提供有关程序集开发者/公司的信息。
以下是MSDN逐步说明的简短版本:
使用SN.EXE创建一个强密钥
sn -k C:\mykey.snk
从Visual Studio,进入项目属性页的签名选项卡,并勾选“签署程序集”来选择刚刚创建的文件
重新构建项目,完成。您的程序集现在已经签名。您可以在项目的CSPROJ文件中看到这一点:
<PropertyGroup> <SignAssembly>true</SignAssembly> </PropertyGroup> <PropertyGroup> <AssemblyOriginatorKeyFile>mykey.snk</AssemblyOriginatorKeyFile> </PropertyGroup>
gacutil 工具允许您管理 GAC 中的共享程序集:
- 安装: gacutil /i myassembly.dll
- 在 GAC 中查看程序集: gacutil /l myassembly.dll
- 卸载: gacutil /u myassembly.dll
.SNK 文件有什么作用?
SNK 是“Strong Name Key”文件。