Как может создание X509Certificate2 из массива байтов PKCS # 12 вызвать CryptographicException («Система не может найти указанный файл.»)?

Я пытаюсь создать X509Certificate2 из большого двоичного объекта PKCS # 12 в массиве байтов и получаю довольно загадочную ошибку. Этот код выполняется в настольном приложении с правами администратора в Windows XP.

Трассировка стека выглядит следующим образом, но я заблудился, пытаясь устранить неполадки, потому что _LoadCertFromBlob отмечен [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)

РЕДАКТИРОВАТЬ: BLOB-объект является истинным PKCS # 12, созданным BouncyCastle для C # , содержащим закрытый ключ RSA и сертификат (самоподписанный или недавно зарегистрированный с помощью CA) - что я ' Я пытаюсь преобразовать закрытый ключ и сертификат из библиотеки BouncyCastle в библиотеку System.Security.Cryptography путем экспорта из одного и импорта в другой. Этот код работает на подавляющем большинстве систем, на которых он был опробован; Я просто никогда не видел, чтобы этот конструктор выдавал эту конкретную ошибку. Это может быть какая-то странность окружающей среды на этом одном ящике.

РЕДАКТИРОВАТЬ 2: Ошибка возникает в другой среде в другом городе, и я не могу воспроизвести ее локально, поэтому я могу закончить приходилось списывать это на сломанную установку XP.

Однако, раз уж вы спросили, вот рассматриваемый фрагмент. Код принимает закрытый ключ и сертификат в представлении BouncyCastle, удаляет все предыдущие сертификаты для того же отличительного имени из хранилища личных ключей, и импортирует новый закрытый ключ и сертификат в хранилище личных ключей через промежуточный BLOB-объект PKCS # 12.

// 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()
        .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();

37
задан Jeffrey Hantin 4 October 2010 в 21:07
поделиться