मैं एक बाइट सरणी में एक पीकेसीएस # 12 ब्लॉब से X509Certificate2
बनाने और एक बदसूरत त्रुटि प्राप्त करने का प्रयास कर रहा हूं। यह कोड डेस्कटॉप अनुप्रयोग में Windows XP पर व्यवस्थापक अधिकारों के साथ चल रहा है।पीकेसीएस # 12 बाइट सरणी से X509Certificate2 का निर्माण कैसे कर सकता है CryptographicException ("सिस्टम निर्दिष्ट फ़ाइल नहीं ढूंढ सकता है।")?
स्टैक ट्रेस निम्नानुसार है, लेकिन मैं समस्या निवारण की कोशिश कर रहा हूं क्योंकि _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)
संपादित करें: (या तो स्व-हस्ताक्षरित या हाल ही में एक सीए के साथ दाखिला लिया) ब्लॉब एक सच्चे PKCS # 12 BouncyCastle for C# एक आरएसए निजी कुंजी और प्रमाणपत्र युक्त द्वारा उत्पन्न होता है - क्या करना है कि मैं क्या कोशिश कर रहा हूँ BouncyCastle लाइब्रेरी से System.Security.Cryptography लाइब्रेरी से निजी कुंजी और प्रमाणपत्र को एक से निर्यात करके और दूसरे पर आयात करके कनवर्ट किया जाता है। यह कोड उन अधिकांश प्रणालियों पर काम करता है जिन पर इसकी कोशिश की गई है; मैंने कभी उस कन्स्ट्रक्टर से उस विशेष त्रुटि को नहीं देखा है। यह उस बॉक्स पर कुछ प्रकार की पर्यावरणीय अजीबता हो सकती है।
संपादित करें 2: त्रुटि एक अलग शहर में एक अलग वातावरण में हो रही है, और मैं इसे स्थानीय रूप से पुन: उत्पन्न करने में असमर्थ हूं, इसलिए मैं इसे टूटी हुई XP स्थापना के लिए चाक़ कर सकता हूं।
चूंकि आपने पूछा, हालांकि, यहां प्रश्न में खंड है। कोड BouncyCastle प्रतिनिधित्व में एक निजी कुंजी और प्रमाण पत्र लेता है, व्यक्तिगत कुंजी स्टोर से एक ही विशिष्ट नाम के लिए किसी भी पिछले प्रमाणपत्र को हटा देता है, और एक निजी माध्यमिक पीकेसीएस # 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();
X509KeyStorageFlags.MachineKeySet जोड़ा जा रहा है | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags. byte से लोड करते समय कन्स्ट्रक्टर के लिए निर्यात योग्य [] मेरे लिए काम किया। – Muxa
मुझे Windows Server 2012 पर एक ही त्रुटि का सामना करना पड़ा, जहां सटीक उसी कोड में Windows 7 या Azure क्लाउड में कोई समस्या नहीं थी। मशीनकेससेट में ध्वज को बदलने से समस्या ठीक हो गई। – RMD
इस उदाहरण में PersistKetSet ध्वज से सावधान रहें - यह डिस्क पर महत्वपूर्ण फाइलें छोड़ देता है जो कभी भी साफ़ नहीं होते हैं। यदि आप इस कॉल को बहुत बार बना रहे हैं तो आप एक विशाल साफ-सफाई कार्य के साथ समाप्त हो जाएंगे। (मुझसे पूछें कि मुझे कैसे पता है।) यदि आप केवल स्मृति में प्रमाण का उपयोग कर रहे हैं तो बस MachineKeySet निर्दिष्ट करें। यदि कोड में इन-मेमोरी प्रमाण के साथ किया जाता है तो रीसेट विधि को तुरंत कुंजी फ़ाइल को हटाने के लिए कॉल करें। दुकान में एक बार जोड़ने और फिर से लोड करने के लिए सबसे अच्छा है, हालांकि। यही वह है। –