2017-10-17 24 views
2

Existe-t-il un moyen de vérifier un fichier dll dans un package NuGet lors de l'installation à l'aide de l'API NuGet.Vérification par programme des fichiers authentifiés dans le package NuGet

Scénario:

Je veux un C#/application nette pour pouvoir se mettre à jour lors de l'exécution en utilisant des paquets NuGet.. Comme cela est évidemment assez risqué, je voudrais vérifier que le paquet provient de la source que j'attends d'elle.

Problème:

NuGet ne prend pas en charge la signature du package. Il y a un document sur la question ici: https://blog.nuget.org/20150203/package-signing.html

Ce que je l'ai fait jusqu'à présent:

  1. Construire un projet vide
  2. Signer le fichier dll (signtool signe/t http://timestamp.digicert.com/a » \ app. .dll ")
  3. Créer un package NuGet de celui-ci (spec NuGet add.dll, paquet NuGet. \ app.dll.nuspec)

le fichier dll à l'intérieur du paquet NuGet est maintenant signé et je peux télécharger à un repo NuGet.

Ceci est mon code d'application:

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); 
    } 

L'exemple est tiré ici:

https://blog.nuget.org/20130520/Play-with-packages.html

La seule solution possible, je peux imaginer au moment serait d'utiliser un package de téléchargement fonctionner à partir de l'API NuGet, décompresser le paquet téléchargé, faire le contrôle et l'installer ensuite. Malheureusement, je ne trouve aucun indice dans l'API que le processus d'installation pourrait être fait dans ces deux étapes.

Alternativement, je pourrais utiliser PGP pour créer une signature détachée, signer le paquet NuGet lui-même et faire une vérification sur le paquet NuGet avec la signature détachée. Cependant, cela conduit au même problème de pouvoir d'abord télécharger le paquet.

Je serais reconnaissant pour toute allusion! Je vous remercie.

--- Mise à jour ---

Je pense avoir trouvé un moyen d'utiliser la signature NuGet et PGP pour la vérification du package.Je fais ce qui suit:

  1. obtenir la liste des nugets disponibles à partir NuGet Server (j'utilise Nexus)
  2. Marquer un fichier pour l'installation
  3. Le paquet fournit un lien de téléchargement:

    IPackageRepository repo = PackageRepositoryFactory.Default.CreateRepository(<connectionString>); 
    
    DataServicePackage package = (DataServicePackage) repo.FindPackage(packageId); 
    String downloadUrl = package.DownloadUrl.AbsoluteUri; 
    
  4. Télécharger le package et stocker sur le disque:

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(); 
    } 
} 
  1. Téléchargez la signature détachée d'un autre serveur
  2. Vérifier la signature individuelle et le nupkg téléchargé (je BouncyCastle)
  3. Si la vérification est réussie:
  4. Utilisation le répertoire que le fichier est stocké en tant que nouveau référentiel et installer le package à partir de là
//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>); 

L'utilisation de cette approche vous laisse toujours la possibilité d'authentifier les fichiers dans le paquet NuGet.

Heureux d'entendre ce que vous pensez de cette solution. Merci!

Répondre

0

La simple vérification des DLL à l'intérieur d'un paquet n'est peut-être pas l'option la plus sûre car un fichier malveillant peut être ajouté au paquet, ce qui peut compromettre votre intention/votre machine. L'équipe de NuGet travaille à permettre à l'auteur de signer pour les paquets. Dans ce processus, vous aurez NuGet.exe sign <package> et NuGet.exe verify <package> commandes. Vous pouvez lire plus à ce sujet le the blog post. Les spécifications détaillées sont à - Sign Command et Verify Command.

+0

Votre lien de blog pointe vers un 404. Cependant, j'ai lu, qu'il y a un plan pour implémenter la signature de paquet avec asp.net 5 - Cela laisse toujours la question que faire entre les deux. – Ritzelprimpf

+0

Merci d'avoir signalé cela. J'ai mis à jour le lien du blog. –