"Ein interner Fehler ist aufgetreten." beim Laden der pfx-Datei mit X509Certificate2

79

Ich versuche, ein selbstsigniertes Zertifikat (c #) zu verwenden:

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

auf einem gemeinsam genutzten Webhosting-Server und ich habe eine Fehlermeldung erhalten:

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

Stapelverfolgung endet 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 Entwicklungsmaschine lädt es ok. Der Grund, warum ich * .pfx lade, ist keine * .cer-Datei, da ich einen privaten Schlüsselzugriff benötige (cer-Datei wird in Ordnung geladen). Ich habe pfx auf meinem Dev Mochine so gemacht:

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>

Ich verwende die Version v5.131.3790.0 von makecert

casperOne
quelle
Vielleicht kann dieser Artikel helfen: codeproject.com/KB/WCF/wcfcertificates.aspx
Emmanuel
Ich habe die Fehlermeldung erhalten the system cannot find the file specified. Die Antwort von @Randy Levy hat bei mir funktioniert!
Jess

Antworten:

145

Verwenden Sie den lokalen Computerspeicher für den privaten Schlüssel:

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

MachineKeySetwird beschrieben als "Private Schlüssel werden im lokalen Computerspeicher und nicht im aktuellen Benutzerspeicher gespeichert". Die Standardeinstellung ohne Flags ist das Platzieren im Benutzerspeicher.

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

Ein anderer Ansatz (gemäß einigen Kommentaren unten) besteht darin, die Identität der IIS-Konfiguration oder des App-Pools zu ändern - was funktioniert. 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).

Randy unterstützt Monica
quelle
3
Ja, es hilft, danke. Kannst du erklären warum? docs sagt nichts hilfreiches.
2
Du hast meinen Tag gerettet. Seltsamerweise funktionierte es auf meinem Computer, bevor die Lösung auf .NET 4.0 aktualisiert wurde
Marc Climent
1
In der Tat musste lediglich der Parameter X509KeyStorageFlags.MachineKeySet festgelegt werden. Es ist wirklich traurig, dass die ausgelöste Ausnahme einfach besagt: "Ein interner Fehler ist aufgetreten." Nicht sehr hilfreich.
Nicholi
2
Sie können dem dem App-Pool zugewiesenen Konto auch weitere Berechtigungen für den privaten Schlüssel hinzufügen. Oder ändern Sie die App-Pool-Identität in "Lokaler Dienst".
Guzart
1
Und für eine schnellere Korrektur / Problemumgehung
Ciprian Teiosanu
13

Ich habe versucht, Randys Lösung in MachineKeySet zu ändern, habe dann aber die Fehlermeldung erhalten:

"Schlüssel nicht gültig für die Verwendung im angegebenen Zustand"

Nachdem ich ein wenig gegoogelt hatte, fand ich einen Beitrag, der vorschlug, ihn zu ändern in:

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

und das hat meine Probleme gelöst.

Ich habe den Vorschlag, die Einstellung des App-Pools in der IIS-Konfiguration zu ändern, noch nicht ausprobiert. Gehen Sie dazu zu den erweiterten Einstellungen für den App-Pool Ihrer Site und setzen Sie "Benutzerprofil laden" auf "true". Wenn diese Einstellung falsch ist, sind die Schlüsselcontainer anscheinend nicht zugänglich.

Myke Black
quelle
Ich habe den oben genannten Fehler erhalten und Ihre Lösung hat dazu beigetragen, ihn zu beheben. Vielen Dank.
Mohan Gundlapalli
Ich mag keine Kommentare, die nicht helfen (wie diese hier), aber ich möchte Ihnen sagen, dass Sie meinen Tag retten. Vielen Dank!
Rasputino