2009-12-13 7 views
5

Bei der Installation eines clientseitigen Zertifikats erhalte ich die Ausnahme "Objekt enthält nur die öffentliche Hälfte eines Schlüsselpaares. Ein privater Schlüssel muss ebenfalls bereitgestellt werden". Meine Anwendung ist eine VC# .NET-Anwendung, die über eine ASP.NET-Plattform ausgeführt wird. Die Anwendung verwendet außerdem WSE 2.0, um Zertifikate in SOAP-Anforderungen zu importieren.Objekt enthält nur die öffentliche Hälfte eines Schlüsselpaares

Nachforschung, habe ich festgestellt, dass diese Ausnahme vom Typ System.Security.Cryptography.CryptographicException ist.

Ich bin ziemlich positiv, dass alle meine WSE-Einstellungen korrekt konfiguriert sind, da ich ein ähnliches Zertifikat nach Subject-Distinguished-Name finden konnte. Irgendwelche Ideen werden sehr geschätzt.

Antwort

12

Ich hatte vor kurzem das gleiche Problem. Ich fand one explanation here das für mich funktionierte. Insbesondere die Berechtigungen für den privaten Schlüssel. Die vollständigen Informationen werden unten kopiert.

Es gibt ein paar Dinge, die ich würde Blick auf den ersten:

  1. Haben Sie einen privaten Schlüssel für dieses Zertifikat haben?
  2. Haben Sie der youf-Anwendung die Berechtigung zum Zugriff auf den privaten Schlüssel erteilt?

Sie können feststellen, ob Sie eine privaten Schlüssel durch das Zertifikat über den Windows Certificate Store anzeigen. Gehen Sie dazu folgendermaßen vor:

  1. Wählen Sie im Windows Startmenü Ausführen.
  2. Geben Sie mmc in das Feld "Öffnen:" ein. Klicken Sie auf OK
  3. Wählen Sie "Snap-In hinzufügen/entfernen" aus dem Menü Datei.
  4. Klicken Sie auf die Schaltfläche Hinzufügen.
  5. Wählen Sie "Zertifikate" aus der Liste der verfügbaren Einzelplatz-Snap-Ins. Klicken Sie auf die Schaltfläche Hinzufügen.
  6. Wählen Sie "Computerkonto". Weiter klicken.
  7. Wählen Sie "Lokaler Computer". Klicken Sie auf Fertig stellen.
  8. Klicken Sie auf Schließen.
  9. Klicken Sie auf OK.
    1. Erweitern Sie den Knoten Zertifikate unter dem Konsolenstamm, und öffnen Sie den persönlichen Speicher .
    2. Doppelklicken Sie auf das von Ihnen verwendete Zertifikat. Wenn Sie einen privaten Schlüssel haben, zeigt der Dialog eine Nachricht an der Unterseite an, die besagt "Sie haben einen privaten Schlüssel, der diesem Zertifikat entspricht".

Wenn Sie einen privaten Schlüssel verfügen, sorgen dann , die Ihre Anwendung Erlaubnis hat den Schlüssel für den Zugriff auf:

  1. Öffnen Sie den Windows Explorer.
  2. Navigieren Sie zu dem Ordner C: \ Dokumente und Einstellungen \ All Users \ Data \ Microsoft \ Crypto \ RSA \ MachineKeys Ordner.
  3. Wählen Sie die Dateien aus, die die Schlüssel enthalten, die der WSE benötigt, um abzurufen.
  4. Wählen Sie im Menü Datei die Option Eigenschaften.
  5. Fügen Sie auf der Registerkarte Sicherheit das ASPNET-Konto hinzu, und wählen Sie die vollständige Steuerungsoption aus.
  6. Hinweise: 1. Ermitteln, welche Schlüsseldatei im Ordner MachineKeys mit einem Zertifikat verknüpft ist, kann schwierig sein. Eine einfache Methode ist die Angabe des Erstellungsdatums und der Zeit, wenn ein neues Zertifikat erstellen. Wenn Sie anzeigen die Dateien im Verzeichnis MachineKeys , überprüfen Sie das Datum geändert Feld für das entsprechende Datum und Zeit. 2. Wenn Sie Ihr System so konfiguriert haben, dass es unter einem anderen -Konto als ASPNET ausgeführt wird, verwenden Sie dieses Konto beim Gewähren von Berechtigungen für den Zugriff auf das Zertifikat .
+1

Danke. Das hat geholfen. (Ich hatte einen privaten Schlüssel, aber meine App hatte keinen Zugriff darauf). – KKP

+0

Überprüfen Sie diese Antwort, um herauszufinden, welcher Computerschlüssel einem Zertifikat entspricht: http://serverfault.com/a/642279/401044 – jtate

0

Nach der gleichen Ausnahme der Begegnung: System.Security.Cryptography.CryptographicException, Objekt enthält nur die öffentliche Hälfte eines Schlüsselpaares, geprüft ich eine Alternative, aber weniger optimale Lösung.

Situation: Zertifikat/Schlüssel Nachschlagen funktionierte großartig innerhalb von Visual Studio IIS Express, aber während die Webanwendung unter dem richtigen IIS-Dienst ausgeführt wurde, erhielt ich immer die Ausnahme 'enthält nur öffentliche Hälfte der Schlüsselpaare'.

Ich habe das WSE3 CertificateTool verwendet, um den Abschnitt des privaten Schlüssels im Dateisystem ausfindig zu machen und ausführlich versucht, die Benutzerberechtigungseinstellungen so anzupassen, dass dem ASP-Benutzer die Berechtigungen gemäß der obigen Antwort erteilt werden.

Meine endgültige Korrektur, die nicht schön war, war, einen neuen IIS-Anwendungspool speziell für meinen Webdienstcode zu erstellen und die Benutzeridentität festzulegen, die der Pool als lokaler Computerbesitzer des Zertifikats + privaten Schlüssels ausführt.

Der letzte Ort, an dem ich das Zertifikat installiert habe, war "Lokaler Computer/Vertrauenswürdige Personen".

Mit WSE3 CustomPolicyAssertion, C# .NET:

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

Nach der App Pool Identität zu aktualisieren, keine private Schlüsseldatei überschreibt notwendig waren, wenn die Anwendung Pool-Besitzer ändern.

Verwandte Themen