2017-10-17 82 views
2

有没有办法在使用NuGet API安装时检查NuGet包内的dll文件。以编程方式检查NuGet包中的经过身份验证的文件

场景:

我想一个C#/。NET应用程序能够在使用的NuGet包运行时进行自我更新。由于这显然是非常危险的,我想验证这个包来自我期望它来自的源。

问题:

NuGet不支持包签名。存在纸张解决这里的问题:https://blog.nuget.org/20150203/package-signing.html

我迄今所做的:

  1. 建一个空的项目
  2. 注册DLL文件(signtool签名/吨http://timestamp.digicert.com /一个” \应用程序。 .DLL“)
  3. 从它(的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的

  1. 获取列表(我用的Nexus)
  2. 马克安装文件
  3. 打包提供下载链接:我做了以下

    IPackageRepository repo = PackageRepositoryFactory.Default.CreateRepository(<connectionString>); 
    
    DataServicePackage package = (DataServicePackage) repo.FindPackage(packageId); 
    String downloadUrl = package.DownloadUrl.AbsoluteUri; 
    
  4. 下载磁盘上的包装和储存:

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包内的文件进行身份验证。

    很高兴听到你们对这个解决方案的看法。谢谢!

    回答

    0

    简单地检查包内的dll可能不是最安全的选择,因为恶意文件可以添加到可能危及您的意图/机器的包中。 NuGet团队正在努力允许作者对软件包进行签名。在那个过程中你将有NuGet.exe sign <package>NuGet.exe verify <package>命令。你可以阅读更多关于它the blog post。详细规格在 - Sign CommandVerify Command

    +0

    您的博客文章链接指向404。但是,我已阅读,有计划实施与asp.net 5的包签名 - 这仍然留下了问题之间做什么。 – Ritzelprimpf

    +0

    谢谢你指出。我已更新博客文章链接。 –

    相关问题