Zertifikate: Kann nicht das Zertifikat und den privaten Schlüssel für die Entschlüsselung Fehler finden, wenn Zeichen

StackOverflow https://stackoverflow.com/questions/3936065

Frage

Ich arbeite in Unternehmen mit vielen Servern und PC für Entwickler. Server sind Win2003, PC-Entwickler Windows XP.

In einem Server Win2003 namens preiis01, in Präproduktionsumgebung, andere Menschen in Unternehmen ein Client-Zertifikat installieren andere Benutzer unter Verwendung von (domainCompany \ adminsystems) für die Protokollierung in Server preiis01.

Jeder Administrator verwendet den Benutzer "domainCompany \ adminsystems" für die Log-in-Server preiis01 (unter Verwendung von Terminal-Server, Remote Desktop für Windows XP).

der Benutzer admin ist domainCompany \ adminsystems“, das Zertifikat installiert.

Benutzer Admin es wie folgt installiert werden:

Session Login wie "domainCompany \ adminsystems" Das Zertifikat ist PFX-Datei. Installiere PFX und mit Assistenten. Der Schlüssel privater Check nicht für den Export. Geben Sie das Kennwort und installieren.

Es ist eine Anwendung Web, die AppPool Identität ist. NETWORK SERVICE Konto

Webserver IIS 6.0.

in preiis01,

Die Admin-Benutzer ausführt mmc -> Snap-in -> Zertifikate für Local Machine. In Knoten -> Personal -> Zertifikate, hatte er das Client-Zertifikat zu sehen:

Ausgestellt für ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1

Herausgegeben Von FNMT Clase 2 CA

in den Eigenschaften des Zertifikats, das Daumenabdruck: "93 bc a4 ad 58 c9 3c af 8b eb 0B 2f c7 86 9d 81 70 a6 c4 13"

Der Admin-Benutzer führt diese Befehle aus:

WinHttpCertCfg.exe LOCAL_MACHINE \ My es "ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1" -g -a "NETWORK SERVICE"

Das Ergebnis ist:

  

Matching-Zertifikat:

     

CN = ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1

     

OU = 703015476

     

OU = FNMT Clase 2 CA

     

O = FNMT

     

C = ES

     

Die Gewährung privaten Schlüssel Zugang für   Konto: NT AUTHORITY \ NETWORK SERVICE

Jetzt Admin-Benutzer führt diesen Befehl aus:

WinHttpCertCfg.exe -l -c LOCAL_MACHINE \ My es "ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1"

Das Ergebnis ist:

  

Matching-Zertifikat:

     

CN = ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1

     

OU = 700012476

     

OU = FNMT Clase 2 CA

     

O = FNMT

     

C = ES

     

Weitere Konten und Gruppen mit   Zugriff auf den privaten Schlüssel umfassen:     domainCompany \ adminsystems NT   AUTHORITY \ SYSTEM     BUILTIN \ Administratoren NT   AUTHORITY \ NETWORK SERVICE

, in einer aspx Seite in Web-Anwendung in Server Win2003, IIS 6.0, ich habe diesen Code:

. Hinweis: Wert für X509Certificate2.HasPrivateKeyAccess () ist NO (false) für "ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1" Zertifikat

ASP.NET-Anwendung ausführt, mit der Identität :: NT AUTHORITY \ NETWORK SERVICE

lbInfo.Text += "<br/><br/>ASP.NET application executes using the identity :: <b>" + WindowsIdentity.GetCurrent().Name + "</b><br>";


            var store = new X509Store(StoreLocation.LocalMachine);
            store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
            Certificates = store.Certificates;
            repeater1.DataSource = Certificates;
            repeater1.DataBind();

            var nombreCertificado = "ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1";

            store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
            store.Open(OpenFlags.ReadOnly);

            X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindBySubjectName, nombreCertificado, false);

            if (col.Count > 0)
            {
                X509Certificate2 certificate = col[0];
                store.Close();
                Message.Text = "Certificado " + nombreCertificado + " encontrado en " + StoreLocation.LocalMachine;

                FirmarConCertificado(nombreCertificado, certificate);

            }
            else
            {
                store.Close();
                Message.Text = "El certificado " + nombreCertificado + " no esta instalado en la máquina";
            }


public void FirmarConCertificado(string nombreCertificado, X509Certificate2 certificate)
{
    try
    {
 var mensaje = "Datos de prueba";
                System.Text.Encoding enc = System.Text.Encoding.Default;
                byte[] data = enc.GetBytes(mensaje);

                var contentInfo = new System.Security.Cryptography.Pkcs.ContentInfo(data);
                var signedCms = new System.Security.Cryptography.Pkcs.SignedCms(contentInfo, true);

                var cmsSigner = new System.Security.Cryptography.Pkcs.CmsSigner(certificate);

                //  Sign the CMS/PKCS #7 message
                signedCms.ComputeSignature(cmsSigner);

                //  Encode the CMS/PKCS #7 message
               var ret = Convert.ToBase64String(signedCms.Encode());

 Message.Text += "Firmado con Certificado " + nombreCertificado + " encontrado en " + StoreLocation.LocalMachine;
 }
 catch (Exception ex)
 {
 Message.Text = "Error al firmar con certificado: " + ex.ToString();
 Message.Text += "<br /><br />InnerException: " + ex.InnerException;
 }

}

Der Code nicht für mich, und ich bekomme diese Fehlermeldung:. Kann das Zertifikat und den privaten Schlüssel für die Entschlüsselung finden

Fehlerzeile ist: signedCms.ComputeSignature (cmsSigner);

  

Fehler al firmar con certificado:   System.Security.Cryptography.CryptographicException:   Kann das Zertifikat nicht finden und   private Schlüssel für die Entschlüsselung.

     

an   System.Security.Cryptography.Pkcs.PkcsUtils.CreateSignerEncodeInfo (CmsSigner   signer, Boolean silent) bei   System.Security.Cryptography.Pkcs.SignedCms.Sign (CmsSigner   signer, Boolean silent) bei   System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature (CmsSigner   signer, Boolean silent) bei   System.Security.Cryptography.Pkcs.SignedCms.ComputeSignature (CmsSigner   signer) bei   ASP.dgsfp_test_testcert_aspx.FirmarConCertificado (String   nombreCertificado, X509Certificate2   Zertifikat) in   c: \ Unternehmen \ App \ Test \ TestCert.aspx: line   242

Dann wird der Benutzer admin (Ich erinnere mich, wer das Zertifikat installieren) führt diese Befehle aus:

  

FindPrivateKey My Localmachine -t „93   bc a4 ad 58 c9 3c af 8b eb 0B 2f 86c7   9d 81 70 a6 c4 13" -c

     

FindPrivateKey   Mein Localmachine -n ??"ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1" -a

     

FindPrivateKey Mein Localmachine -n   "CN = ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1"   -a

Das Ergebnis für alle drei Befehle ist das gleiche:

  

FindPrivateKey hilft Benutzer das finden   Lage der privaten Schlüsseldatei von einem   X.50 9 Zertifikat.

     

Verbrauch: FindPrivateKey [{{-n} | {T}   } [-F | -d | -a]]

     

Subjektname des   Zertifikat

     

Fingerabdrucks von der   Zertifikat (Verwendung certmgr.exe zu bekommen   it)

     

-f Name der Ausgabedatei nur

     

-d Ausgabeverzeichnis nur

     

-a Ausgabe absolute Datei   Name z.B. FindPrivateKey Mein   Current -n "CN = John Doe"

     

z. FindPrivateKey My Localmachine -t   „03 33 98 63 47 e7 d0 48 71 33 62 64   76 5c 4c 9d 42 1d 6b 52" -c

FindPrivateKey nichts, aber WinHttpCertCfg.exe -l funktioniert (Matching-Zertifikat)

Wir haben Privilegien den Netzwerkdienst Benutzer angesichts das WinHttpCertCfg.exe-Tool und in Code ASP.NET (execute unter Netzwerkdienstkonto) das Zertifikat gefunden wird. Aber nicht, wenn Zeichen Zertifikat.

Wenn jemand könnte uns einige Informationen über, oder Vorschläge

Update:

Benutzer in der Domäne "domainCompany \ Pre_Certificado" installieren Zertifikat im Speicher des lokalen Computers.

domainCompany \ Pre_Certificado Administrator ist in der IIS_WPG-Gruppe, hat Lokale Richtlinien: „Melden Sie sich als Service„

konfigurieren I AppPool Identität in IIS 6.0 für: domainCompany \ Pre_Certificado

ASP.NET-Anwendung ausführt, mit der Identität :: domainCompany \ Pre_Certificado

Ich recycle AppPool und Anwendung ausführen, ich System.Security.Cryptography.CryptographicException erhalten: Kann nicht das Zertifikat und den privaten Schlüssel für die Entschlüsselung

finden

Wenn ich noch einmal zu testen, melden Sie sich an Sitzung im Server IIS, mit domainCompany \ Pre_Certificado Benutzern, nenne ich Seite in ASP.NET-Anwendung und alles ist in Ordnung.

(Hinweis: log in Server IIS Terminal Server)

Aber wenn Abmelde Sitzung in Server IIS (Benutzer: domainCompany \ Pre_Certificado), habe ich die gleiche Fehlermeldung erhalten:

System.Security.Cryptography.CryptographicException: Kann nicht das Zertifikat und den privaten Schlüssel finden für die Entschlüsselung

Alle Vorschläge ??

War es hilfreich?

Lösung

Bitte überprüfen Sie diese Dokument was würden Sie hilft, das Problem zu beheben. Ich würde empfehlen, Befehl-Option zu verwenden folgende:

winhttpcertcfg -g -c LOCAL_MACHINE\My -s MyCertificate -a TESTUSER 

Andere Tipps

Haben die ersten 2 Schritte als die gleiche wie bei IIS 7.5 (hier klicken)

  1. Erstellen / Kauf-Zertifikat. Stellen Sie sicher, dass es einen privaten Schlüssel hat.
  2. Importieren Sie das Zertifikat in den „Local Computer“ Konto. Beste Zertifikate MMC zu verwenden. Stellen Sie sicher, "Allow private Schlüssel exportiert werden" prüfen
  3. Führen Sie den folgenden Befehl als Administrator an. Ersetzen Sie die folgende:

    • Ersetzen Sie [Betreff] mit dem Thema des Zertifikats und die Verwendung Anführungszeichen, wenn es Leerzeichen enthält. Ich denke, man kann auch nur das erste Wort setzen, solange es nicht eine andere cert ist, dass beginnt mit dem gleichen Thema.
    • Ersetzen Sie [Speicher] mit dem Zertifikatspeicher Sie importiert, Standard Ich glaube, ist "ROOT" oder "MY" auf IIS 6, das heißt "LOCAL_MACHINE \ ROOT" oder "LOCAL_MACHINE \ MY"
    • Ersetzen [Computer] mit dem Namen des Computers. Sie könnten in der Lage sein zu verwenden "\" Notation für [computernam] d "\ NETWORK SERVICE", aber ich habe es nicht versucht.

WinHttpCertCfg.exe -g -a "[Computer] \ NETWORK SERVICE" -c LOCAL_MACHINE \ [Store] es "[Betreff]"

Hinweis: Wenn Sie mit ASP.NET-Anwendung Pool unter einer anderen Identität als „NETWORK SERVICE“ werden Sie die Änderung benötigen „NETWORK SERVICE“ im obigen Befehl an die Identität, die Sie‘ wieder läuft der Anwendungspool von IIS.

müssen möglicherweise auch Zugang zu den anonymen Benutzern gewähren. Wenn Sie den anonymen Zugriff erlauben dann wird die Anforderung als anonymer Benutzer nicht ausgeführt Netzdienst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top