签署集会意味着什么?为什么要这样做?
签署它的最简单方法是什么?什么是.snk文件?
答案 0 :(得分:32)
另外两个答案很好,但还有一点。在“证书”签名和“强名”签名之间很容易混淆。
强名称签名的目的就像Stefan Steinegger所说:允许您的客户确定他们正在加载的代码确实正是他们正在加载的代码。这就是所有强大的名字。具体而言,强名称不会建立客户与您之间的任何信任关系。如果客户认为他们信任来自您的代码,那么由他们来确定您的代码的正确强名称。 “关键管理”问题没有以任何方式解决;客户有责任找出如何知道要信任的密钥。
证书签名,即使用从Verisign或其他认证机构获得的证书进行签名,具有更复杂的目的。证书签名的目的是建立一个经过身份验证的信任和身份链,从认证机构到签署代码的组织。您的客户可能不信任您,您的客户可能甚至没有听到您,但您的客户可以说“如果Verisign保证此代码作者的身份,那么我会相信他们”。由于认证机构为他们承担了这一负担,因此减少了客户的密钥管理问题。
答案 1 :(得分:9)
对程序集进行签名是为程序集提供一个强名称。
首先,让我们做一个重要的区别。 在.NET中对程序集进行分类的一种方法如下:
为什么呢?具有强名称可确保您的程序集是唯一的,并且没有人可以窃取GUID(如在COM中)来创建具有相同名称的不同对象。换句话说,您确保在加载已签名的程序集时,您正在加载您认为正在加载的内容。 Eric Lippert对这个特定问题提出了一个很好的答案here。
这与可以信任签名程序集的说法不同。为此,程序集可以包含Authenticode,这是一个数字签名,用于提供有关程序集开发人员/公司的信息。
以下是MSDN step-by-step的简短版本:
使用SN.EXE
创建一个强密钥sn -k C:\ mykey.snk
从Visual Studio中,在项目“属性”页面上,转到“签名”选项卡,然后选中“签署程序集”以选择刚刚创建的文件
重建你的项目,瞧。您的程序集现已签名。您可以在项目的CSPROJ文件中看到这一点:
<PropertyGroup> <SignAssembly>true</SignAssembly> </PropertyGroup> <PropertyGroup> <AssemblyOriginatorKeyFile>mykey.snk</AssemblyOriginatorKeyFile> </PropertyGroup>
SNK是'强名称密钥'文件。
答案 2 :(得分:7)
这意味着赋予程序集唯一的标识。这样做是为了保证装配来自特定的来源。请参阅MSDN文章 Strong-Named Assemblies 。强名称程序集支持Side by Side Execution,Assembly placement in the GAC,Versioning和其他一些功能。
最简单的签名方法是在Visual Studio中使用签名选项卡中的项目属性。这实际上在.csproj
文件中添加了一个XML条目,该条目告诉构建引擎使用所述密钥文件对程序集进行签名。密钥文件是我们正在讲的这个“.snk”文件。它是使用sn.exe .NET tool生成的。它包含签署assembly所需的所有信息。
答案 3 :(得分:7)
签署是为了证明程序集是由已知的人或公司创建的,而不是由其他任何人更改。
签署程序集时,会创建一个哈希并使用私钥进行签名。如果更改程序集(例如恶意软件),则可以通过使用公钥(包含在程序集中)检查哈希和签名来轻松查找。
签署程序集是为了保护目标系统不被黑客攻击。您可以在.NET配置中关闭签名检查。检查签名符合最终用户的利益。加载程序集时会检查签名。
snk文件包含用于对程序集进行签名的私钥,以及用于检查程序集的公钥。它需要得到保护。如果有人获得了您的私钥,他可以签署集会,就好像他们签署的那样。
签名的最简单方法是在项目设置中选择snk文件。