有沒有辦法在使用NuGet API安裝時檢查NuGet包內的dll文件。以編程方式檢查NuGet包中的經過身份驗證的文件
場景:
我想一個C#/。NET應用程序能夠在使用的NuGet包運行時進行自我更新。由於這顯然是非常危險的,我想驗證這個包來自我期望它來自的源。
問題:
NuGet不支持包簽名。存在紙張解決這裏的問題:https://blog.nuget.org/20150203/package-signing.html
我迄今所做的:
- 建一個空的項目
- 註冊DLL文件(signtool簽名/噸http://timestamp.digicert.com /一個」 \應用程序。 .DLL「)
- 從它(的NuGet規範add.dll,包裝的NuGet創建NuGet包。\ app.dll.nuspec)
的NuGet包內的DLL文件正在簽署,我可以上傳它到一個NuGet回購。
這是我的應用程序代碼:
public static void installPackage(string packageId, string connectionString, string path){
IPackageRepository repo = PackageRepositoryFactory.Default.CreateRepository(connectionString);
PackageManager packageManager = new PackageManager(repo, path);
packageManager.InstallPackage(packageId);
}
的例子就是從這裏取:
https://blog.nuget.org/20130520/Play-with-packages.html
唯一可能的解決方案,我可以在那一刻想象是使用一個下載包函數從NuGet API中解壓縮,解壓下載的包,然後執行檢查並安裝。可悲的是,我無法在API中找到任何提示,以便在這兩個步驟中完成安裝過程。
或者,我可以使用PGP創建分離簽名,簽署NuGet包本身並使用分離簽名對NuGet包進行檢查。但是,這導致首先能夠下載該軟件包的相同問題。
我會感激任何提示!謝謝。
---更新---
我想我已經找到了一種方法來使用的NuGet和PGP簽名程序包驗證。從的NuGet服務器可用NuGets的
- 獲取列表(我用的Nexus)
- 馬克安裝文件
打包提供下載鏈接:我做了以下
IPackageRepository repo = PackageRepositoryFactory.Default.CreateRepository(<connectionString>); DataServicePackage package = (DataServicePackage) repo.FindPackage(packageId); String downloadUrl = package.DownloadUrl.AbsoluteUri;
下載磁盤上的包裝和儲存:
using (var client = new WebClient()){
client.UseDefaultCredentials = true;
client.Credentials = new NetworkCredential(<User>, <Pass>);
var content = client.DownloadData(downloadUrl);
using (MemoryStream memoryStream = new MemoryStream(content)){
FileStream fs = new FileStream(<pathToLocalRepo>, FileMode.CreateNew);
memoryStream.CopyTo(fs);
fs.Close();
}
}
- 從不同的服務器
- 下載分離的簽名驗證分離的簽名和所下載的nupkg(I使用BouncyCastle的)
- 如果驗證成功:
- 使用目錄中的文件存儲爲新的存儲庫,並從那裏
//Initialize local repository
string path = <pathToLocalRepo>;
IPackageRepository localRepo = PackageRepositoryFactory.Default.CreateRepository(path);
var packages = repo.GetPackages();
//Initialize the package manager
PackageManager packageManager = new PackageManager(localRepo, path);
//Install
packageManager.InstallPackage(<packageId>);
安裝包
使用這種方法仍然會讓您有可能對NuGet包內的文件進行身份驗證。
很高興聽到你們對這個解決方案的看法。謝謝!
您的博客文章鏈接指向404。但是,我已閱讀,有計劃實施與asp.net 5的包簽名 - 這仍然留下了問題之間做什麼。 – Ritzelprimpf
謝謝你指出。我已更新博客文章鏈接。 –