9

我管理一个开源项目,并希望签署项目二进制包中发布的二进制文件。我使用 Visual Studiocsprojsln文件来管理和构建我的项目,并将这些文件作为项目源包的一部分进行分发。

如何签署我的构建生成的二进制文件而不必分发snk密钥对文件?如果我使用 Visual Studio 对程序集进行签名,则每个项目文件现在都需要密钥对的副本才能构建。我对分发密钥对感到不舒服,即使它受密码保护。

编辑

另一个需要注意的是,项目中的某些程序集通过 授予朋友访问权限InternalsVisibleToAttribute,并通过项目引用构建这些朋友。因此,此类程序集在引用已签名程序集时需要使用强名称。但是,如果密钥对未分发,那么最终用户如何构建源代码并维护项目关系?如果使用临时密钥对文件,签名程序集的公钥令牌不会更改,从而破坏InternalsVisibleToAttribute引用吗?

4

3 回答 3

6

您不应分发密钥对。strongname 用于验证新版本的程序集是否来自同一发布者。

如果另一个开发人员想要对您的项目进行分支,他们将生成自己的密钥对,这将有效地表明他们的版本不是来自您,因此除非重新编译,否则依赖于您的其他程序集将不再加载。这并不总是很方便,但它可以保护您免受有人发布恶意版本的程序集并默默地分发它。

于 2009-12-02T07:52:47.647 回答
6

这是一个老问题,但目前投票率最高的答案并不准确,所以我认为值得发布一个新答案。

对于开源项目,Microsoft 建议将您的私钥签入您的存储库。这是安全的,因为强名称密钥用于标识,而不是安全。

请参阅此处以供参考:https ://docs.microsoft.com/en-us/dotnet/framework/app-domains/strong-named-assemblies

不要依赖强名称来保证安全。它们仅提供唯一身份。

他们还专门针对开源项目:

如果您是开源开发人员,并且希望获得强名称程序集的身份优势,请考虑将与程序集关联的私钥检入源代码控制系统。

如果您希望您的程序集安全,那么您应该查看Authenticode 签名https ://blogs.msdn.microsoft.com/shawnfa/2005/12/13/authenticode-and-assemblies/

于 2018-09-08T04:48:25.767 回答
2

如果代码中唯一的程序集引用是项目文件中编码的那些,那么Sharptooth 的解决方案效果很好。如果您的项目通过或其他需要强名称字符串的方式引用其他程序集InternalsVisibleToAttribute,则使用临时密钥构建存储库源是不可行的。这样做将更改强名称字符串中存在的公钥引用并破坏代码。

我的应用程序就是这种情况,因此我需要采用不同的方法。

我基本上在单独的文件夹层次结构中创建了sln和文件的副本,并按如下方式修改了文件。csprojcsproj

  • 将所有文件引用转换为链接,指向原始来源。
  • 复制并修改了每个 AssemblyInfo.cs 文件以包含InternalsVisibleToAttribute具有强名称的使用。
  • 修改每个csproj文件,使snk文件引用为相对路径(无需将snk文件复制到每个项目)

我首先手动完成了所有这些,但后来意识到这可以以一种简单的方式自动化。第一步和第三步可以用 XSLT 来实现,而第二步可以用正则表达式搜索/替换功能来实现。

由于我现在需要维护两个解决方案,因此自动执行此任务以避免将来的麻烦是有意义的。

存储库中的源不使用强名称构建程序集,这很好,因为我不想对最终用户施加任何构建限制或流程。

于 2009-12-07T21:12:34.560 回答