.Net 组件库先混淆签名,再打包成.nupkg包

目前,我们项目组打算做增量升级的功能,这涉及到dll库增量改变,只有修改过代码的dll才需要有文件的变化,否则文件和对应的版本是不会改变的。

我们之前的打包的项目有一个小缺陷:

在整个应用打包输出的时候,才对包文件进行 dll 和 exe 的混淆和签名。而且每一次的混淆和签名都会修改文件的属性如:MD5、CRC32的重要的文件属性进行校验。如果一个我们自己封装的Nuget包,版本号为:1.0.0.0.但是在A应用引用后,混淆、签名打包后,应用库的版本号还是1.0.0.0,但是文件的属性经过签名和混淆,已经变更了。所以在升级校验文件属性的时候,就会检测到MD5值已经改变了,就会执行下载更新。

解决方案

针对以上的问题,我们打算对自己开发的Nuget库包,在打包的时候,对生成的库先混淆、签名,再打包成.nupkg包

1、修改库工程文件的配置,取消 <GeneratePackageOnBuild>true</GeneratePackageOnBuild>的属性设置

我们之前在工程文件添加了 <GeneratePackageOnBuild>true</GeneratePackageOnBuild>,该属性是指定msbuild 在编译的同时,直接打包成.nupkg包。由于我们需要在编译完做混淆和签名的动作,所以需要把它去掉,手动打包处理

2、对工程文件进行编译,生成对应的库文件

dotnet build -c Release

 3、调用 ObfuscarAutoConfigTool.exe ,对整个输出的库文件夹进行混淆

ObfuscarAutoConfigTool.exe E:\H3C\WindowsComponents\H3C.Windows.Core\H3C.Windows.Core\bin\Release

注意:

3.1、ObfuscarAutoConfigTool.exe 是我们组内为了方便开发和管理,基于Obfuscar 库开发的小工具,只对于未签名的文件进行混淆

obfuscar.xml 中需要 AssemblySearchPath 标签,因为所有需要的 DLL 都已经存在,但是在输出对于.netCore的版本,存在引用项不输出的情况,所以存在混淆报错的情况

 

3.2、所以需要库工程文件添加  <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> 属性,把依赖项都输出到库文件中

 

3.3、执行完显示Completed,说明混淆成功了

 4、对编译输出的文件进行签名

wosigncodecmd sign /tp "指纹Key" /p pin码 /hide /isf /c /dig sha256 /tr http://timestamp.digicert.com /file E:\H3C\WindowsComponents\H3C.Windows.Core\H3C.Windows.Core\bin\Release/*.*

由于我们使用的沃通提供的签名,只需要调用厂家提供的 wosigncodecmd.exe 进行签名。其实也可以 使用微软提供的 dotnet nuget sign 的方式对 整个 .nupkg 签名,详情看:对 NuGet 包进行签名 | Microsoft Learn

签完名之后,对应的库文件的文件属性就有签名的属性了

 

5、对整个Rleease 文件 进行打包

dotnet pack --no-build -c Release

由于我们是对已经编译的文件进行打包,所以需要指定参数  --no-build 进行打包,防止之前混淆签名的库文件被重新编译替换了

 打包完成之后,就会有.nupkg的nuget包了。

 

经过以上的操作,应用再引用该nuget包,再混淆打包,就会检测存在签名了,从而跳过该库文件,不进行 混淆和签名了。

 

参考文档:

使用Obfuscar对.NET项目进行混淆保护的实践-CSDN博客

对 NuGet 包进行签名 | Microsoft Learn

dotnet pack 命令 - .NET CLI | Microsoft Learn

Correct Usage for ASP.NET Core 2.0 · Issue #132 · obfuscar/obfuscar

 

posted @ 2025-04-03 10:30  wuty007  阅读(114)  评论(0)    收藏  举报