9
votes

Quelle est la manière recommandée de gérer une paire de clés de nom forte pour un projet open-source?

Je gère un projet open-source et souhaitez signer les fichiers binaires libérés dans le package binaire du projet. J'utilise les fichiers Visual Studio CSPROJ CSPROJ et SLN pour gérer et construire mon projet, et distribuez également ces fichiers dans le cadre des packages source du projet.

Comment puis-je signer les fichiers binaires produits de ma construction et ne pas avoir à distribuer le fichier snk key-paire? Si j'utilise Visual Studio pour signer les assemblages, chaque fichier de projet a maintenant besoin d'une copie de la liste de clés afin de construire. Je ne suis pas à l'aise avec la distribution de la liste de clé, même s'il s'agit de mot de passe protégé.

Modifier :

Une autre mise en garde est que certaines assemblées de l'accès au projet subventionnent l'accès via internesVissibletoTtribute et construisent ces amis via une référence de projet. Par conséquent, ces assemblées doivent utiliser un nom fort lors de la référence à un assemblage signé. Toutefois, si la liste de clé n'est pas distribuée, comment les utilisateurs finaux peuvent-ils mettre en place les sources et entretenir les relations de projet? Si un fichier de paire de clé temporaire est utilisé, le jeton de clé publique ne changera pas les assemblages signés, ne cassant pas les références internesVissibletoTtribute


0 commentaires

3 Réponses :


6
votes

Vous ne devez pas distribuer le clavier. Le nom fort est de vérifier que la nouvelle version de l'Assemblée provient du même éditeur.

Si un autre développeur veut brancher votre projet, ils généreront leur propre keypair et qui montrent efficacement que leur version ne vous fait pas de vous, afin que d'autres assemblages qui dépendent de la vôtre ne se chargeent plus à moins qu'elles ne soient pas recompalisées. Ce n'est pas toujours pratique mais cela vous protège de quelqu'un qui émet une version malveillante de l'assemblage et la distribuant silencieusement.


3 commentaires

Puisqu'à ce que je dois distribuer les fichiers de projet et de solution, et car la clé de clé est requise pour la solution de construction (lorsque la signature est activée), dois-je également distribuer une paire de clé "factice" afin que les utilisateurs finaux puissent construire sans avoir à manipuler les fichiers de projet? Il semble lourd d'enregistrer des fichiers de projet qui désactivent la signature, seulement pour avoir à basculer ce paramètre chaque fois qu'une version est effectuée.


Vous pouvez effectuer ce qui suit: Ajoutez une étape de construction qui vérifierait si un fichier .Snk existe déjà et exécutez Sn.exe pour générer un nouveau si nécessaire. Ensuite, il va construire dès le référentiel pour d'autres utilisateurs.


Assurer l'identité de l'éditeur n'est pas l'objet prévu de la signature du nom fort. Vous êtes censé utiliser l'authentification pour cela. La documentation de Microsoft recommande de publier le fichier SNK: Docs .microsoft.com / fr-US / DotNet / Standard / Assembly / ...



2
votes

La solution de Sharpoth fonctionne bien si les seules références de montage dans le code sont celles codées dans les fichiers de projet. Si votre projet fait référence à d'autres assemblages via internesVissibletoTtribute ou d'autres moyens où une chaîne de nom forte est requise, il n'est pas possible de construire les sources de référentiel avec une clé temporaire. Cela va changer les principales références présentes dans les chaînes de noms forts et rompt le code.

C'est le cas dans ma demande, donc je devais adopter une approche différente.

J'ai fondamentalement créé une copie du sln et CSPROJ dans une héritière de dossier séparé et modifié les fichiers csproj comme suit.

  • a transformé toutes les références de fichiers aux liens, pointant vers les sources d'origine.
  • copié et modifié chaque fichier montageInfo.cs pour contenir des utilisations de internesVissibletoTribute avec un nom fort.
  • modifié chaque fichier csproj de sorte que la référence de fichier snk est un chemin relatif (supprime la nécessité de copier le fichier snk à chaque projet )

    J'ai d'abord fait tout cela manuellement, mais j'ai ensuite compris que cela peut être automatisé de manière simple. Les première et troisième étapes peuvent être mises en œuvre avec un XSLT, où la deuxième étape peut être mise en œuvre avec une fonction de recherche / remplacement de regex.

    Puisque je dois maintenir deux solutions maintenant, il est logique d'automatiser cette tâche pour éviter les maux de tête futurs.

    Les sources du référentiel ne construisent pas d'assemblages avec des noms forts, ce qui va bien, car je ne voudrais pas imposer de restrictions ou de processus de construction sur les utilisateurs finaux.


0 commentaires

6
votes

C'est une ancienne question, mais la réponse actuellement votée n'est pas exacte, je pensais donc que cela vaut la peine d'avoir posté une nouvelle réponse.

Pour des projets open source, Microsoft recommande de vérifier votre clé privée dans votre référentiel. Ceci est en sécurité car les clés de noms fortes sont utilisées pour l'identité, pas la sécurité.

voir ici pour référence: https: / /docs.microsoft.com/en-us/dotnet/framework/app-domains/strong-nomed-assemblies

Ne comptez pas sur des noms forts pour la sécurité. Ils fournissent une identité unique uniquement.

Ils traitent également spécifiquement des projets open source:

Si vous êtes un développeur à source ouvert et que vous souhaitez que les avantages d'identité d'un assemblage solide nommé, envisagez de vérifier la clé privée associée à un assemblage dans votre système de contrôle source.

Si vous souhaitez une sécurité pour vos assemblages, vous devez rechercher authencitrice Signature : https://blogs.msdn.microsoft.com/shawnfa/2005/12/13/authenticode-and-assemblies/


0 commentaires