Vorgehensweise: Zugänglichmachen von X.509-Zertifikaten für WCF
Damit ein X.509-Zertifikat für Windows Communication Foundation (WCF) zugänglich ist, muss der Name und der Speicherort des Zertifikats im Anwendungscode angegeben werden. In bestimmten Fällen benötigt die Prozessidentität Zugriff auf die Datei, die den zugeordneten privaten Schlüssel für das X.509-Zertifikat enthält. Um den privaten Schlüssel zu erhalten, der einem X.509-Zertifikat in einem Zertifikatspeicher zugeordnet ist, benötigt WCF die entsprechenden Berechtigungen. Standardmäßig können nur der Besitzer und das Systemkonto auf den privaten Schlüssel eines Zertifikats zugreifen.
So machen Sie X.509-Zertifikate für WCF zugänglich
Erteilen Sie dem Konto, unter dem WCF ausgeführt wird, Schreibzugriff auf die Datei, die den zugeordneten privaten Schlüssel für das X.509-Zertifikat enthält.
Ermitteln Sie, ob WCF Lesezugriff auf den privaten Schlüssel für das X.509-Zertifikat benötigt.
Die folgende Tabelle beschreibt, ob ein privater Schlüssel bei der Verwendung eines X.509-Zertifikats verfügbar sein muss.
Verwendung des X.509-Zertifikats Privater Schlüssel Digitales Signieren einer ausgehenden SOAP-Nachricht. Ja Überprüfen der Signatur einer eingehenden SOAP-Nachricht. Nein Verschlüsseln einer ausgehenden SOAP-Nachricht. Nein Verschlüsseln einer eingehenden SOAP-Nachricht. Ja Ermitteln Sie den Ort und Namen des Zertifikatspeicherspeichers, in dem sich das Zertifikat befindet.
Der Zertifikatspeicher, in dem das Zertifikat gespeichert ist, wird entweder im Anwendungscode oder in einer Konfiguration angegeben. Im folgenden Beispiel wird angegeben, dass sich das Zertifikat im
CurrentUser
-Zertifikatsspeicher mit dem NamenMy
befindet.cc.ClientCredentials.ClientCertificate.SetCertificate( StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "contoso.com");
cc.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "contoso.com")
Ermitteln Sie, wo sich der private Schlüssel für das Zertifikat auf dem Computer befindet. Verwenden Sie dazu das Tool FindPrivateKey.
Für das Tool FindPrivateKey wird der Name und der Speicherort des Zertifikatsspeichers und eine Angabe benötigt, die das Zertifikat eindeutig identifiziert. Als eindeutiger Bezeichner werden der Antragstellername oder der Fingerabdruck des Zertifikats von dem Tool akzeptiert. Weitere Informationen zum Bestimmen des Fingerabdrucks eines Zertifikats finden Sie unter Abrufen des Fingerabdrucks eines Zertifikats.
Im folgenden Codebeispiel wird mithilfe des Tools FindPrivateKey der Speicherort des privaten Schlüssels für ein Zertifikat im
My
-Speicher inCurrentUser
mit einem Fingerabdruck von46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d
ermittelt.findprivatekey.exe My CurrentUser -t "46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d" -a
Ermitteln Sie das Konto, unter dem WCF ausgeführt wird.
In der folgenden Tabelle werden die Konten beschrieben, unter denen WCF in einem bestimmten Szenario ausgeführt wird.
Szenario Prozessidentität Client (Konsole oder WinForms-Anwendung) Aktuell angemeldeter Benutzer Selbst gehosteter Dienst Aktuell angemeldeter Benutzer Dienst, der in IIS 6.0 (Windows Server 2003) oder IIS 7.0 (Windows Vista) gehostet wird. NETZWERKDIENST Dienst, der in IIS 5.X (Windows XP) gehostet wird. Wird durch das <processModel>
-Element in der Datei Machine.config gesteuert. ASPNET ist das Standardkonto.Erteilen Sie der Datei, die den privaten Schlüssel für das Konto enthält, unter dem WCF ausgeführt wird, mithilfe eines Tools wie cacls.exe Lesezugriff.
Im folgenden Codebeispiel wird die besitzerverwaltete Zugriffssteuerungsliste (DACL) für die angegebene Datei bearbeitet, um dem NETZWERKDIENST-Konto Lesezugriff (:R) auf die Datei zu gewähren.
icacls.exe "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\8aeda5eb81555f14f8f9960745b5a40d_38f7de48-5ee9-452d-8a5a-92789d7110b1" /grant "NETWORK SERVICE":R