签署.NET程序集

时间:2011-01-18 14:33:25

标签: .net code-signing

我正在努力掌握.NET dll / assembly的正式签名。

特别是

  • 何时以及如何使用私钥
  • 创建/控制私钥的最佳做法
  • 需要签署什么样的模块/最佳实践才能实现它

5 个答案:

答案 0 :(得分:4)

  1. 当您希望消费者知道装配确实来自您(而非冒名顶替者)时
  2. 实体/组织的私钥只能由少数人访问并保存在lock-n-key下。在开发过程中使用延迟签名。
  3. 理想情况下,您应该签署所有托管程序集。

答案 1 :(得分:4)

请参阅使用Strong Name Signatures获取有关签名的非常好的文章。

如果我们正在谈论强大的程序集命名,那么应该使用签名来阻止第三方“欺骗”您的代码。强名称是程序集的一部分,因此具有相同名称和不同签名的另一个程序集是不同的程序集。这也可以防止修改和重新签名程序集(没有私钥)。

要有用,私钥必须保密。这通常通过delayed signing和仔细管理私钥访问来完成。

您还可以使用Authenticode(为强名称程序集签名);这可以增加装配实际来自谁的信心。

答案 2 :(得分:2)

请勿将强名称签名 Authenticode签名

混淆

正如微软一般描述的那样(我直接向一本书的作者询问过),强名称只是一种版本控制,而不是身份验证。程序集也通过强名称公钥存储在GAC中,用于可靠性purporses(您发布新版本的库,之前不会被覆盖以防止旧应用程序中的回归错误)。

我不是百分百确定,但Mono的System程序集与Microsoft的公钥相匹配。不是真正的安全形式.............

相反,Authenticode签名用于执行代码身份验证。您需要来自受信任CA的付费证书,并使用signtool.exe或Visual Studio对您的程序集进行签名。

这里所说的关于安全性,签名服务器等的所有内容都适用于此处。但问题是,您没有指定要将哪种签名放入代码中。

答案 3 :(得分:1)

* When and how to use private keys
* Best practices for creation/control of private keys

您创建并使用密钥对(file.SNK)。只创建一次(针对您的公司/部门)并保证安全。

* What sort of modules need to be signed/ best practice for going about it

需要签署进入GAC的库。但最佳做法是签署您发运的所有装配。

如果此签名的可靠性非常重要,您可以在发货前使用“部分签名”和最终签名。这意味着并非每个开发人员都需要访问(真实/完整)密钥对。

答案 4 :(得分:0)

通常,代码签名对于您的产品是软件或在每个软件都受到严格审查的环境中工作非常有用。通过签署您办公室的自定义软件,您可以将其置于比其他人更高的信任关系中。

通常,您生成私钥,然后在构建时,可以在构建服务器上附加该私钥。这可以防止公司周围的开发人员访问私钥。

您所签署的内容完全取决于您。我想说,在给定某个信任环境的情况下,最容易出错的模块需要被签名....例如,访问文件系统对象或数据库连接字符串的DLL。我会养成签署最少量代码然后从那里建立起来的习惯,否则,你冒着签署所有内容的风险,然后假设你组织中的所有东西都可以安全运行。同样,这完全取决于您组织中的安全问题级别。