X509Certificate2
バイト配列のPKCS#12 BLOBからを構築しようとしていますが、かなり不可解なエラーが発生します。このコードは、WindowsXPの管理者権限を持つデスクトップアプリケーションで実行されています。
_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は、RSA秘密鍵と証明書(自己署名または最近CAに登録されたもの)を含むC#用にBouncyCastleによって生成された真のPKCS#12です-私がやろうとしているのは、秘密鍵と証明書を変換することですBouncyCastleライブラリからSystem.Security.Cryptographyライブラリに、一方からエクスポートしてもう一方にインポートすることにより。このコードは、試されたシステムの大部分で機能します。そのコンストラクターからスローされた特定のエラーを見たことがありません。それはその1つの箱のある種の環境の奇妙さかもしれません。
編集2:エラーは別の都市の別の環境で発生しており、ローカルで再現できないため、壊れたXPインストールにチョークで書く必要があるかもしれません。
しかし、あなたが尋ねたので、ここに問題の断片があります。このコードは、BouncyCastle表現の秘密鍵と証明書を取得し、同じ識別名の以前の証明書を個人鍵ストアから削除し、新しい秘密鍵と証明書を中間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<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();