有没有办法在使用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
谢谢你指出。我已更新博客文章链接。 –