2009-12-13 12 views
5

Lors de l'installation d'un certificat côté client, l'exception "Objet ne contient que la moitié publique d'une paire de clés et une clé privée doit également être fournie". Mon application est une application VC# .NET s'exécutant sur une plate-forme ASP.NET. L'application utilise également WSE 2.0 pour importer des certificats dans la création de requêtes SOAP.L'objet ne contient que la moitié publique d'une paire de clés

Lors de la recherche, j'ai constaté que cette exception est de type System.Security.Cryptography.CryptographicException.

Je suis assez positif tous mes paramètres WSE sont configurés correctement, puisque j'ai pu trouver un certificat similaire par subject-distinguished-name. Toutes les idées seront grandement appréciées.

Répondre

12

J'ai récemment eu le même problème. J'ai trouvé one explanation here qui a fonctionné pour moi. Plus précisément, les autorisations pour la clé privée. L'information complète est copiée ci-dessous.

Il y a deux choses que je regarder d'abord:

  1. Avez-vous une clé privée pour ce certificat?
  2. Avez-vous autorisé l'application youf à accéder à la clé privée ?

Vous pouvez déterminer si vous avez une clé privée en consultant le certificat par le magasin de certificats Windows. Pour cela, procédez comme suit:

  1. Dans le menu Démarrer de Windows, sélectionnez Exécuter.
  2. Tapez mmc dans le champ Open:. Cliquez sur OK
  3. Sélectionnez "Ajouter/Supprimer un composant logiciel enfichable" dans le menu Fichier.
  4. Cliquez sur le bouton Ajouter.
  5. Sélectionnez "Certificats" dans la liste des composants logiciels enfichables autonomes disponibles. Cliquez sur le bouton Ajouter.
  6. Sélectionnez "Compte d'ordinateur". Cliquez sur Suivant.
  7. Sélectionnez "Ordinateur local". Cliquez sur Terminer.
  8. Cliquez sur Fermer.
  9. Cliquez sur OK.
    1. Développez le nœud Certificats sous la racine de la console et ouvrez le magasin personnel .
    2. Double-cliquez sur le certificat que vous utilisez. Si vous avez une clé privée , la boîte de dialogue affiche un message en bas qui indique "Vous avez une clé privée qui correspond à ce certificat ".

Si vous avez une clé privée, puis assurer que votre demande a la permission pour accéder à la clé:

  1. Ouvrez l'Explorateur Windows.Accédez au dossier C: \ Documents and Settings \ Tous les utilisateurs \ Application \ Data \ Microsoft \ Crypto \ RSA \ MachineKeys .
  2. Sélectionnez les fichiers contenant les clés que le WSE devra récupérer .
  3. Dans le menu Fichier, sélectionnez Propriétés. Dans l'onglet Sécurité, ajoutez le compte ASPNET et sélectionnez l'option de contrôle Full .
  4. Remarques: 1. La détermination du fichier de clé dans le dossier MachineKeys associé à un certificat peut être difficile à . Une méthode simple consiste à noter la date et l'heure de création lorsque créant un nouveau certificat. Lorsque vous affichez les fichiers dans le répertoire de MachineKeys, vérifiez le champ Date de modification pour la date correspondante et heure. 2. Si vous avez configuré votre système pour s'exécuter sous un autre compte que ASPNET, utilisez ce compte lors de l'octroi d'autorisations pour accéder au certificat .
+1

Merci. Cela a aidé. (J'avais une clé privée, mais mon application n'y avait pas accès). – KKP

+0

cochez cette réponse pour savoir quelle clé de la machine correspond à un certificat: http://serverfault.com/a/642279/401044 – jtate

0

Après avoir rencontré la même exception: System.Security.Cryptography.CryptographicException, objet ne contient que la moitié du public d'une paire de clés, je récolement une alternative, mais solution moins optimale. Situation: La recherche de clé/certificat a bien fonctionné dans Visual Studio IIS Express, mais pendant que l'application Web s'exécutait sous le service IIS approprié, je recevais toujours l'exception «Contient uniquement la moitié publique de la paire de clés». J'ai utilisé le CertificateTool WSE3 pour localiser la section de clé privée sur le système de fichiers et j'ai longuement essayé d'ajuster les paramètres d'autorisation de l'utilisateur pour donner à l'utilisateur ASP les permissions selon la réponse ci-dessus. Mon correctif éventuel, qui n'était pas joli, consistait à créer un nouveau pool d'applications IIS spécifique à mon code de service Web et à définir l'identité de l'utilisateur que le pool exécute en tant que propriétaire de la clé privée + certificat.

L'emplacement final dans lequel j'ai installé le certificat était "Ordinateur local/Personnes de confiance".

En utilisant WSE3 CustomPolicyAssertion, C# .NET:

clientToken = X509TokenProvider.CreateToken(StoreLocation.LocalMachine, 
    StoreName.TrustedPeople, "soap.partnersite.com", X509FindType.FindBySubjectName); 

Après la mise à jour de l'App Identité du pool, invalidations fichier clé privée ont été nécessaires lors du changement de propriétaire du pool d'applications.