Comment construire une X509Certificate2 à partir d'un fichier PKCS#12 tableau d'octets jeter CryptographicException(“Le système ne peut pas trouver le fichier spécifié.”)?

Je suis en train de construire un X509Certificate2 à partir d'un fichier PKCS#12 blob dans un tableau d'octets et d'obtenir un assez déroutant d'erreur. Ce code est en cours d'exécution dans une application de bureau avec des droits d'administrateur sur Windows XP.

La trace de la pile est comme suit, mais je me suis perdu en essayant de résoudre les problèmes, car _LoadCertFromBlob est marqué [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: Le blob est un vrai PKCS#12 généré par BouncyCastle pour C# contenant une clé privée RSA et certificat auto-signé ou récemment inscrit auprès d'une autorité de certification) -- ce que je suis en train de faire est de convertir la clé privée et le certificat du BouncyCastle bibliothèque pour le Système.De sécurité.Bibliothèque de cryptographie par l'exportation à partir de l'un et de l'importation à l'autre. Ce code fonctionne sur la plupart des systèmes, il a été essayé sur; j'ai juste jamais vu cette erreur renvoyé à partir de ce constructeur. Il peut être une sorte de environnemental "bizarre" sur une boîte.

EDIT 2: L'erreur se produit dans un environnement différent dans une autre ville, et je suis incapable de reproduire localement, donc j'ai peut-être la craie jusqu'à une fracture installation de windows XP.

Depuis que vous avez posées, même si, ici, est le fragment en question. Le code prend une clé privée et le certificat en BouncyCastle représentation, supprime les certificats précédents pour le même Nom unique du personnel du magasin de clés, et les importations de la nouvelle clé privée et le certificat dans le personnel clé de stockage par le biais d'un intermédiaire PKCS#12 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();