Wie kann das Konstruieren eines X509Certificate2 aus einem PKCS # 12 Byte-Array CryptographicException auslösen ("Das System kann die angegebene Datei nicht finden.")?
Ich versuche zu bauen X509Certificate2
aus einer PKCS#12-der blob in ein byte-array und ein eher rätselhaften Fehler. Dieser code läuft in einer desktop-Anwendung mit administrator-rechten auf Windows XP.
Den stack-trace ist wie folgt, aber ich habe verloren versuchen zu beheben, da _LoadCertFromBlob
gekennzeichnet ist [MethodImpl(MethodImplOptions.InternalCall)]
.
System.Security.Cryptography.CryptographicException: The system cannot find the file specified.
at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags)
EDIT: Der blob ist eine wahre PKCS#12 generiert BouncyCastle für C# mit einem privaten RSA-Schlüssel und das Zertifikat (selbstsigniert oder vor kurzem eingeschrieben mit einer, CA) -- das, was ich versuche zu tun ist, konvertieren Sie den privaten Schlüssel und das Zertifikat aus dem BouncyCastle-Bibliothek zum System.Sicherheit.Kryptographie-Bibliothek mit dem Export aus einem und Import in der anderen. Dieser code funktioniert auf den allermeisten Systemen ist es versucht worden ist, auf; ich habe nur noch nie gesehen, dass insbesondere Fehler geworfen, der Konstruktor. Es kann sein eine Art von Umwelt-Verrücktheit auf, dass die box.
EDIT 2: Der Fehler Auftritt, in einer anderen Umgebung, in einer anderen Stadt, und ich bin nicht in der Lage, um es zu reproduzieren lokal, so kann ich Sie bis zum Ende der Kreide es bis zu einer kaputten XP-installation.
Seit Ihr gefragt, aber, hier ist das fragment in Frage. Der code dauert, einen privaten Schlüssel und ein Zertifikat in BouncyCastle Darstellung, löscht alle vorherigen Zertifikate für die gleichen Distinguished Name aus dem persönlichen Schlüssel speichern, und importiert die neue private Schlüssel und das Zertifikat in den persönlichen Schlüssel speichern über eine zwischengeschaltete PKCS#12-der blob.
//open the personal keystore
var msMyStore = new X509Store(StoreName.My);
msMyStore.Open(OpenFlags.MaxAllowed);
//remove any certs previously issued for the same DN
var oldCerts =
msMyStore.Certificates.Cast<X509Certificate2>()
.Where(c => X509Name
.GetInstance(Asn1Object.FromByteArray(c.SubjectName.RawData))
.Equivalent(CurrentCertificate.SubjectDN))
.ToArray();
if (oldCerts.Length > 0) msMyStore.RemoveRange(new X509Certificate2Collection(oldCerts));
//build a PKCS#12 blob from the private key and certificate
var pkcs12store = new Pkcs12StoreBuilder().Build();
pkcs12store.SetKeyEntry(_Pkcs12KeyName,
new AsymmetricKeyEntry(KeyPair.Private),
new[] {new X509CertificateEntry(CurrentCertificate)});
var pkcs12data = new MemoryStream();
pkcs12store.Save(pkcs12data, _Pkcs12Password.ToCharArray(), Random);
//and import it. this constructor call blows up
_MyCertificate2 = new X509Certificate2(pkcs12data.ToArray(),
_Pkcs12Password,
X509KeyStorageFlags.Exportable);
msMyStore.Add(_MyCertificate2);
msMyStore.Close();
InformationsquelleAutor der Frage Jeffrey Hantin | 2010-09-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie die PKCS#12-oder gerade PFX-Datei? In der Microsoft-Welt ist es das gleiche, aber andere denken, anderen (siehe http://www.drh-consultancy.demon.co.uk/pkcs12faq-old.html#PFX).
Können Sie versuchen Sie einfach die folgenden
(siehe http://msdn.microsoft.com/en-us/library/ms148418.aspx) oder
(siehe http://msdn.microsoft.com/en-us/library/ms148420.aspx und http://msdn.microsoft.com/en-us/library/ms148442.aspx wenn Sie verwenden müssen einige flags)
AKTUALISIERT: Es wäre hilfreich, wenn Sie fügen Sie ein code-fragment, und nicht nur die Ausnahme-stack-trace.
Die
X509KeyStorageFlags
verwenden Sie? Sie können Process Monitorum herauszufinden, welche Datei nicht finden konnte, dieX509Certificate2
Konstruktor. Es kann zum Beispiel sein, dass es keine Standard-key container für den aktuellen Benutzer auf dem Windows XP mit dem problem. Sie können es erstellen, und wiederholen Sie den import.InformationsquelleAutor der Antwort Oleg
Ich lief in das gleiche Problem.
Gemäß dieser kb-Artikel das problem war, dass der Konstruktor zu laden versucht das cert in das aktuelle Profil des Benutzers, aber der .Net-code, den ich war die Identität der Benutzer und so hatte es nicht geladen, der Benutzer-Profil. Der Konstruktor benötigt die geladenen Benutzerprofil, um richtig zu arbeiten.
Aus dem Artikel:
Laden der Benutzer-Profil den Fehler behoben.
InformationsquelleAutor der Antwort Zain Rizvi
Läuft in dieser in eine web-Anwendung auf Windows 2012, Einstellung Anwendungspool die option
Load User Profile
zu wahr es zu arbeiten.Um dies zu tun, führen Sie
inetmgr.exe
gehen Sie zuAdvanced Settings
für die richtige Anwendung pool, ändernLoad User Profile
unterProcess Model
zu wahren.InformationsquelleAutor der Antwort deerchao
Ich hatte genau das gleiche problem. Der code und die Daten/certs lief einwandfrei auf Windows 2003 x86, bei der Ausführung unter einem bestimmten Benutzer, aber nicht unter einem anderen account (der auch für die Ausführung von IIS app pools).
Anscheinend einige andere Sache, die erschöpften Ressourcen auf Windows, so dass die fehlerhafte Benutzer konnte nicht wirklich laden des Benutzerprofils (desktop war seltsam aussehenden), obwohl es keine verwandten Ereignisse in der Ereignisanzeige.
Einem Neustart löste das problem vorübergehend. Dies ist zwar keine dauerhafte Lösung, es zeigt, dass es etwas anderes ist (z.B. COM+ - Komponenten, native-code-Dienste, etc) verbrauchen Ressourcen, die untersucht werden muss. Es zeigt auch die Instabilität von Windows-Plattformen...
InformationsquelleAutor der Antwort Ricardo Pardini
Hatte ich das gleiche problem.
Dies ermöglicht es der crypto-subsystem zu arbeiten.
InformationsquelleAutor der Antwort paqogomez