2017-10-17 139 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

    謝謝你指出。我已更新博客文章鏈接。 –

    相關問題