2009-08-28 6 views
70

Ich versuche Verwendung selbst signiertes Zertifikat (C#):"Ein interner Fehler ist aufgetreten." wenn pfx Datei mit X509Certificate2 Laden

X509Certificate2 cert = new X509Certificate2(
    Server.MapPath("~/App_Data/myhost.pfx"), "pass"); 

auf einem gemeinsamen Web-Hosting-Server und ich habe einen Fehler:

System.Security.Cryptography.CryptographicException: An internal error occurred. 

Stack-Trace Ende mit

System.Security.Cryptography.CryptographicException. 
    ThrowCryptogaphicException(Int32 hr) +33 
System.Security.Cryptography.X509Certificates.X509Utils. 
    _LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, 
     Boolean persistKeySet, SafeCertContextHandle& pCertCtx) +0 
System.Security.Cryptography.X509Certificates.X509Certificate. 
    LoadCertificateFromFile(String fileName, Object password, 
     X509KeyStorageFlags keyStorageFlags) +237 
System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(
    String fileName, String password) +131 

Auf meiner dev Maschine lädt es ok. Der Grund, warum ich * .pfx keine * .cer Datei lade, weil ich einen privaten Schlüsselzugriff brauche (cer Datei lädt Ok). Ich habe pfx auf meinem dev mochine wie folgt aus:

makecert -r -n "CN=myhost.com, [email protected]" -sky exchange -b 01/01/2009 
    -pe -sv myhost.pvk myhost.cer 
<b>pvk2pfx</b> -pvk myhost.pvk -spc myhost.cer -pfx myhost.pfx -po pass</code> 

I Version v5.131.3790.0 von makecert bin mit

+0

Vielleicht kann dieser Artikel helfen: http://www.codeproject.com/KB/WCF/wcfcertificates.aspx – Emmanuel

+0

Ich bekam die Fehlermeldung "das System kann die angegebene Datei nicht finden". Die Antwort von @Randy Levy hat für mich funktioniert! – Jess

Antwort

136

den lokalen Computerspeicher für den privaten Schlüssel verwenden:

X509Certificate2 cert = new X509Certificate2("myhost.pfx", "pass", 
    X509KeyStorageFlags.MachineKeySet); 

MachineKeySet wird beschrieben als "private Schlüssel werden im lokalen Computerspeicher und nicht im aktuellen Benutzerspeicher gespeichert". Der Standardwert ohne Flags ist das Platzieren im Benutzerspeicher.

Obwohl Sie das Zertifikat vom Datenträger lesen und in einem Objekt speichern, werden die privaten Schlüssel weiterhin in der Schlüsseldatenbank des Microsoft Cryptographic API Cryptographic Service Providers gespeichert. Auf dem Hosting-Server hat der ASP.NET-Prozess keine Berechtigung zum Zugriff auf den Benutzerspeicher.

Ein anderer Ansatz (wie einige Kommentare unten) besteht darin, die IIS-Konfiguration oder App Pool-Identität zu ändern - die funktionieren. Dies setzt jedoch voraus, dass Zugriff auf diese Konfigurationselemente besteht, was möglicherweise nicht der Fall ist (z. B. in einer gemeinsam genutzten Hosting-Umgebung).

+3

ja es hilft, danke. Könntest du erklären warum? Docs sagt nichts hilfreich. –

+2

Du hast meinen Tag gerettet. Seltsamerweise funktionierte es auf meinem Computer, bevor die Lösung auf .NET 4.0 aktualisiert wurde. –

+1

In der Tat musste nur der Parameter X509KeyStorageFlags.MachineKeySet gesetzt werden. Es ist wirklich traurig, dass die ausgelöste Ausnahme einfach "Ein interner Fehler ist aufgetreten" angezeigt wird. Nicht sehr hilfreich. – Nicholi

8

versuchte ich Randys Lösung es MachineKeySet ändern, bekam aber dann die Fehlermeldung:

„Schlüssel nicht gültig für den Einsatz in bestimmten Zustand“

So nach ein wenig googeln um ich einen Beitrag gefunden, dass vorgeschlagen, es zu ändern:

var certificate = new X509Certificate2(certKeyFilePath, passCode, 
X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet |  
X509KeyStorageFlags.PersistKeySet); 

und dies meine Probleme aussortiert.

Ich habe den Vorschlag noch nicht ausprobiert, um die Einstellung App-Pool-Einstellung in der IIS-Konfiguration zu ändern. Um dies zu tun, gehen Sie zu den erweiterten Einstellungen für den App-Pool Ihrer Website und legen Sie dann "Benutzerprofil laden" auf "wahr" fest. Wenn diese Einstellung falsch ist, sind die Schlüsselcontainer anscheinend nicht zugänglich.

+0

Ich habe den oben genannten Fehler erhalten und Ihre Lösung hat geholfen, diesen Fehler zu beheben. Danke. – mohang