現在、プロジェクトチームでは段階的アップデート機能の実装を計画しています。これは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. プロジェクトファイルをコンパイルし、対応するライブラリファイルを生成
msbuild H3C.Windows.Core.csproj -p:Configuration=Release
3. ObfuscateTool.exe を使用して、出力されたライブラリフォルダ全体を難読化
ObfuscateTool.exe "C:\Projects\H3C.Windows.Core\bin\Release"
注意点:
3.1、ObfuscateTool.exe はチーム内で開発と管理を容易にするために、Obfuscarライブラリを基に作成した小さなツールで、署名されていないファイルのみを難読化します
obfuscate_config.xml の中にAssemblySearchPathタグが必要です。必要なDLLはすべて存在しますが、.NET Coreの場合、参照項目が出力されないケースがあるため、難読化エラーが発生することがあります
3.2、そのため、ライブラリプロジェクトファイルに <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> プロパティを追加し、依存関係をすべてライブラリファイルに出力する必要があります
3.3、完了と表示されれば難読化が成功したことを意味します
4. コンパイル出力ファイルに署名
SignTool.exe sign /f "C:\Certificates\library.pfx" /p パスワード /t http://timestamp.digicert.com /d "H3C Windows Core Library" "C:\Projects\H3C.Windows.Core\bin\Release\*.dll"
私たちはSignTool.exeを使用してファイルに署名します。.nupkgパッケージ全体を署名する場合は、Microsoftが提供するdotnet nuget signコマンドを使用することもできます。詳細は「NuGetパッケージの署名 | Microsoft Learn」を参照してください
署名後、対応するライブラリファイルには署名の属性が含まれます
5. リリースフォルダ全体をパッケージ化
dotnet pack H3C.Windows.Core.csproj --no-build -c Release
既にコンパイルされたファイルをパッケージ化するため、--no-buildパラメータを指定して、以前に難読化・署名されたライブラリファイルが再コンパイルされて置き換えられるのを防ぎます
パッケージ化が完了すると、.nupkgのNuGetパッケージが生成されます。
上記の操作を行った後、アプリケーションがこのnugetパッケージを参照し、難読化パッケージ化を行っても、署名が存在することが検出され、ライブラリファイルの難読化と署名をスキップします。
参考ドキュメント:
.NETプロジェクトの難読化保護に関するObfuscarの使用-CSDNブログ
NuGetパッケージの署名 | Microsoft Learn
dotnet packコマンド - .NET CLI | Microsoft Learn
ASP.NET Core 2.0の正しい使用方法 · Issue #132 · obfuscar/obfuscar