Ste*_*idi 7 c# strongname open-source assembly-signing visual-studio
我管理一个开源项目,并希望签署项目二进制包中发布的二进制文件.我使用Visual Studio csproj
和sln
文件来管理和构建我的项目,并将这些文件作为项目源包的一部分进行分发.
如何签署生成的二进制文件而不必分发snk
密钥对文件?如果我使用Visual Studio对程序集进行签名,则每个项目文件现在都需要密钥对的副本才能构建.即使密码保护,我也不习惯分发密钥对.
编辑:
另一个需要注意的是,项目中的某些程序集InternalsVisibleToAttribute
通过项目引用授予朋友访问权限,并构建这些朋友.因此,在引用签名的程序集时,此类程序集需要使用强名称.但是,如果密钥对未分发,那么最终用户如何构建源并维护项目关系?如果使用临时密钥对文件,签名程序集的公钥标记是否会更改,从而破坏InternalsVisibleToAttribute
引用?
您不应该分发密钥对.强名称用于验证新版本的程序集来自同一发布者.
如果另一个开发人员想要分支您的项目,他们将生成他们自己的密钥对,这将有效地显示他们的版本不是来自您,以便依赖于您的其他程序集将不再加载,除非它们被重新编译.这并不总是方便,但它可以保护您免受发布恶意版程序集并静默分发它的人的攻击.
这是一个老问题,但目前投票最高的答案并不准确,所以我认为值得发布一个新答案。
对于开源项目,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/
如果代码中唯一的程序集引用是项目文件中编码的程序集引用,那么Sharptooth 的解决方案就可以很好地工作。如果您的项目通过或其他需要强名称字符串的方式引用其他程序集InternalsVisibleToAttribute
,则使用临时密钥构建存储库源是不可行的。这样做将更改强名称字符串中存在的公钥引用并破坏代码。
我的应用程序就是这种情况,因此我需要采用不同的方法。
我基本上在单独的文件夹层次结构中创建了sln
和文件的副本,并按如下方式修改了文件。csproj
csproj
InternalsVisibleToAttribute
复制并修改每个 AssemblyInfo.cs 文件以包含强名称的使用。csproj
文件,使snk
文件引用是相对路径(无需将snk
文件复制到每个项目)我首先手动完成所有这些工作,但后来意识到这可以以简单的方式自动化。第一个和第三个步骤可以用XSLT来实现,而第二个步骤可以用正则表达式搜索/替换功能来实现。
由于我现在需要维护两个解决方案,因此自动化此任务以避免将来出现问题是有意义的。
存储库中的源代码不会构建具有强名称的程序集,这很好,因为我不想对最终用户施加任何构建限制或流程。
归档时间: |
|
查看次数: |
2698 次 |
最近记录: |