Quelle est la méthode recommandée pour gérer une paire de clés avec un nom fort pour un projet open source?

Je gère un projet open-source et souhaite signer les fichiers binarys publiés dans le package binary du projet. sln fichiers csproj et sln Visual Studio pour gérer et générer mon projet, mais je les dissortingbue également dans le cadre des packages source du projet.

Comment puis-je signer les fichiers binarys produits de ma construction sans avoir à dissortingbuer le snk clés snk ? Si j’utilise Visual Studio pour signer les assemblys, chaque fichier de projet nécessite désormais une copie de la paire de clés pour pouvoir être généré. Je ne suis pas à l’aise avec la dissortingbution de la paire de clés, même si elle est protégée par un mot de passe.

Modifier :

Un autre inconvénient est que certaines assemblées du projet accordent l’access à un ami via InternalsVisibleToAtsortingbute et construisent ces amis via une référence de projet. Par conséquent, ces assemblages doivent utiliser un nom fort pour faire référence à un assemblage signé. Cependant, si la paire de clés n’est pas dissortingbuée, comment les utilisateurs finaux peuvent-ils créer les sources et maintenir les relations du projet? Si un fichier de paire de clés temporaire est utilisé, le jeton de clé publique des assemblys signés ne changera-t-il pas, cassant les références InternalsVisibleToAtsortingbute ?

Vous ne devez pas dissortingbuer la paire de clés. Le nom fort permet de vérifier que la nouvelle version d’assembly provient du même éditeur.

Si un autre développeur souhaite créer une twig pour votre projet, il génère sa propre paire de clés, ce qui montre bien que sa version ne provient pas de vous, de sorte que les autres assemblys dépendant du vôtre ne se chargeront plus à moins d’être recompilés. Ce n’est pas toujours pratique, mais cela vous protège de la part d’une personne qui émet une version malveillante d’assembly et qui la dissortingbue en silence.

La solution de Sharptooth fonctionne bien si les seules références d’assemblées dans le code sont celles encodées dans les fichiers de projet. Si votre projet fait référence à d’autres assemblys via InternalsVisibleToAtsortingbute ou par un autre moyen lorsqu’une chaîne de nom fort est requirejse, il est alors impossible de créer les sources du référentiel avec une clé temporaire. Cela modifierait les références de clé publique présentes dans les chaînes de nom fort et romprait le code.

C’est le cas dans ma candidature et j’ai donc dû adopter une approche différente.

J’ai essentiellement créé une copie des fichiers sln et csproj dans un dossier séparé et modifié les fichiers csproj comme suit.

  • Transformé toutes les références de fichier en liens, en pointant vers les sources d’origine.
  • Copié et modifié chaque fichier AssemblyInfo.cs afin de contenir les utilisations de InternalsVisibleToAtsortingbute avec un nom fort.
  • Modification de chaque fichier csproj afin que la référence de fichier snk soit un chemin relatif (il n’est plus nécessaire de copier le fichier snk dans chaque projet)

J’ai d’abord fait tout cela manuellement, mais je me suis ensuite rendu compte que cela pouvait être automatisé de manière simple. Les première et troisième étapes peuvent être implémentées avec un XSLT, la deuxième étape pouvant être implémentée avec une fonction de recherche / remplacement de regex.

Étant donné que je dois maintenir deux solutions maintenant, il est logique d’automatiser cette tâche afin d’éviter de futurs maux de tête.

Les sources du référentiel ne construisent pas d’assemblys avec des noms forts, ce qui est bien, car je ne voudrais pas imposer de ressortingctions de construction ni de processus aux utilisateurs finaux.

C’est une vieille question, mais la réponse actuellement la plus votée n’est pas exacte, alors j’ai pensé qu’il valait la peine de poster une nouvelle réponse.

Pour les projets open source, Microsoft recommande d’archiver votre clé privée dans votre référentiel. Ceci est sûr car les clés de nom fort 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-named-assemblies

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

Ils abordent également spécifiquement les projets open source:

Si vous êtes un développeur open source et que vous souhaitez bénéficier des avantages d’identité d’un assembly avec nom fort, envisagez de vérifier la clé privée associée à un assembly dans votre système de contrôle de code source.

Si vous souhaitez sécuriser vos assemblys, consultez la signature Authenticode : https://blogs.msdn.microsoft.com/shawnfa/2005/12/13/authenticode-and-assemblies/