NewLifeX / NewLife.Redis

High performance redis client, support NETCore/. NET4. 0/. NET4. 5. It is specially optimized for big data and message queue. The average daily consumption of online single application is 10 billion. 高性能Redis客户端,支持.NETCore/.NET4.0/.NET4.5,为大数据与消息队列而特别优化,线上单应用日均100亿调用量

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

程序集为什么不加上强名称?

andywu188 opened this issue · comments

贵公司发布的所有开源项目,NuGet上发布的程序集为什么不加上强名称呢?

由于自己的项目,一直都有使用强名称,但贵公司的程序集没有强名称,导致引用后,编译运行时,出现依赖项错误。

异常信息:
System.IO.FileLoadException:“未能加载文件或程序集“NewLife.Redis, Version=3.9.8008.16870, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。需要强名称程序集。 (异常来自 HRESULT:0x80131044)”

commented

好主意,我们尽快安排加上

@andywu188 感觉你的开发模式存在问题。1. 你的强签名是在开发阶段,对每个程序进行签名? 如果是的话,那证明你的证书可以被开发者直接获取到,有证书泄露风险

  1. 你的签名是发布阶段签名。 2.1 开发阶段没有使用正式证书签名? 如果不是为了测试需求的话,开发阶段可以不加签名

大部分的开发过程都是: 开发阶段不做签名,或者使用延迟签名,或者采用测试证书等。不做签名比较推荐,那在何时进行签名?发布阶段,证书只存放在服务器上,在打包服务器(构建服务器)上对程序集进行签名。如此你将不会遇到以上的开发问题,同时可以更好的减少证书泄露问题

@lindexi

你说的是没有错,都对。

不过,一般来讲,作为开源项目,基本都把key.snk文件放在项目源代码中,很多大公司都是这样,包括微软、阿帕奇等大公司或组织。
以下项目举例:
https://github.com/aspnet/Microsoft.Data.Sqlite/tree/master/build
https://system.data.sqlite.org/index.html/dir?ci=e76de45fffbb6ab5&name=Keys

另外,强签名,也仅仅只是用于验证程序集是否被篡改,并没有什么太大其他作用。
你说的证书泄露风险,有点吓人,就算你我程序集不给我证书,我也有多种方式,绕过强签名,比如:1、把修改过的DLL加入到GAC缓存,2、全局替换签名,3、HOOK技术,强制签名验证通过
所以,证书并没有你想像的那么重要,微软官方都已经说了,证书签名他无法保护你的代码安全,他仅仅只是个验证篡改而已。

@lindexi

基本人人都用过的Newtonsoft.Json:
https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Dynamic.snk

NUnit单元测试
https://github.com/nunit/nunit/blob/master/src/nunit.snk

Xunit单元测试
https://github.com/xunit/xunit/blob/main/src/signing.snk

StackExchange.Redis
https://github.com/StackExchange/StackExchange.Redis/blob/main/StackExchange.Redis.snk

NanUI:
https://gitee.com/dotnetchina/NanUI/blob/0.5.0/NetDimension.NanUI/StrongKey.snk

以上项目,每个开发者,至少用过两个,都是将签名证书放在源代码项目中。
就算项目源代码中不放,至少您发布在NuGet上的包,应该做好强签名吧,但贵公司NuGet包中的程序集没有签名。

commented

恢复net461的支持,增加程序集签名 · 0871d4e
0871d4e