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

Schreibe einen Kommentar