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
c#
x509certificate
pfx
casperOne
quelle
quelle
the system cannot find the file specified
. Die Antwort von @Randy Levy hat bei mir funktioniert!Antworten:
Verwenden Sie den lokalen Computerspeicher für den privaten Schlüssel:
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". 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).
quelle
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.
quelle