2010-09-29 7 views
29

मैं एक बाइट सरणी में एक पीकेसीएस # 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(); 

उत्तर

34

क्या आपके पास पीकेसीएस # 12 या सिर्फ पीएफएक्स-फाइल है? माइक्रोसॉफ्ट की दुनिया में यह वही है, लेकिन दूसरे एक और सोचते हैं (http://www.drh-consultancy.demon.co.uk/pkcs12faq-old.html#PFX देखें)।

आप (http://msdn.microsoft.com/en-us/library/ms148420.aspx और http://msdn.microsoft.com/en-us/library/ms148442.aspx देख आप कुछ झंडे का उपयोग की जरूरत है)

UPDATED सिर्फ निम्नलिखित

X509Certificate2 cert = X509Certificate2(byte[] rawData, "password"); 
X509Certificate2 cert2 = X509Certificate2(byte[] rawData, "password", 
       X509KeyStorageFlags.MachineKeySet | 
       X509KeyStorageFlags.PersistKeySet | 
       X509KeyStorageFlags.Exportable); 

(http://msdn.microsoft.com/en-us/library/ms148418.aspx देखें) या

X509Certificate2 cert = X509Certificate2("C:\Path\my.pfx", "password"); 

कोशिश कर सकते हैं: यह होगा यदि आप एक कोड खंड डालते हैं और न केवल अपवाद स्टैक ट्रेस डालें तो सहायक हो।

कौन सा X509KeyStorageFlags क्या आप उपयोग करते हैं? X509Certificate2 कन्स्ट्रक्टर को कौन सी फ़ाइल नहीं मिल सका, यह जानने के लिए आप Process Monitor का उपयोग कर सकते हैं। उदाहरण के लिए यह हो सकता है कि समस्या वाले Windows XP पर वर्तमान उपयोगकर्ता के लिए कोई डिफ़ॉल्ट कुंजी कंटेनर नहीं है। आप इसे बना सकते हैं और आयात को पुनः प्रयास कर सकते हैं।

+3

X509KeyStorageFlags.MachineKeySet जोड़ा जा रहा है | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags. byte से लोड करते समय कन्स्ट्रक्टर के लिए निर्यात योग्य [] मेरे लिए काम किया। – Muxa

+2

मुझे Windows Server 2012 पर एक ही त्रुटि का सामना करना पड़ा, जहां सटीक उसी कोड में Windows 7 या Azure क्लाउड में कोई समस्या नहीं थी। मशीनकेससेट में ध्वज को बदलने से समस्या ठीक हो गई। – RMD

+2

इस उदाहरण में PersistKetSet ध्वज से सावधान रहें - यह डिस्क पर महत्वपूर्ण फाइलें छोड़ देता है जो कभी भी साफ़ नहीं होते हैं। यदि आप इस कॉल को बहुत बार बना रहे हैं तो आप एक विशाल साफ-सफाई कार्य के साथ समाप्त हो जाएंगे। (मुझसे पूछें कि मुझे कैसे पता है।) यदि आप केवल स्मृति में प्रमाण का उपयोग कर रहे हैं तो बस MachineKeySet निर्दिष्ट करें। यदि कोड में इन-मेमोरी प्रमाण के साथ किया जाता है तो रीसेट विधि को तुरंत कुंजी फ़ाइल को हटाने के लिए कॉल करें। दुकान में एक बार जोड़ने और फिर से लोड करने के लिए सबसे अच्छा है, हालांकि। यही वह है। –

1

मुझे बिल्कुल वही समस्या थी। एक विशिष्ट उपयोगकर्ता के तहत चलते समय एक ही कोड और डेटा/कर्ट विंडोज 2003 x86 पर ठीक चलते थे, लेकिन दूसरे खाते के अंतर्गत असफल रहे (जिसका उपयोग आईआईएस ऐप पूल चलाने के लिए भी किया जाता था)।

जाहिर है, कुछ अन्य बात विंडोज पर समाप्त संसाधन, ताकि नाकाम रहने उपयोगकर्ता वास्तव में उपयोगकर्ता के प्रोफ़ाइल लोड नहीं कर सका (अपने डेस्कटॉप अजीब दिखने था), हालांकि वहां थे ईवेंट व्यूअर में कोई संबंधित घटनाओं।

एक रीबूट ने समस्या को अस्थायी रूप से हल किया। यद्यपि यह समस्या का कोई स्थायी समाधान नहीं है, यह दिखाता है कि कुछ और है (उदाहरण के लिए, COM + घटक, देशी कोड सेवाएं, आदि) उपभोग करने वाले संसाधनों की जांच की आवश्यकता है। यह विंडोज प्लेटफार्मों की अस्थिरता भी दिखाता है ...

+0

अस्थिरता का यह विशेष स्वाद भारी इंटरप्रोसेस-संचार-निर्भर डेस्कटॉप सॉफ़्टवेयर और संसाधन के चेहरे में खराब मजबूती के संयोजन से संबंधित प्रतीत होता है थकावट। मैंने पूर्व में लिनक्स पर गनोम, और विशेष रूप से विकास के साथ समस्याओं का सटीक वर्ग देखा है। –

8

मैं एक ही मुद्दे में भाग गया।

इस kb article के अनुसार समस्या यह थी कि निर्माता वर्तमान उपयोगकर्ता की प्रोफ़ाइल में प्रमाण लोड करने का प्रयास करता है, लेकिन नेट कोड मैं उपयोगकर्ता का प्रतिरूपण कर रहा था और इसलिए उसने उपयोगकर्ता प्रोफ़ाइल लोड नहीं की थी। कन्स्ट्रक्टर को लोड की गई उपयोगकर्ता प्रोफ़ाइल को ठीक से काम करने की आवश्यकता होती है।

लेख से:

X509Certificate2 वर्ग कंस्ट्रक्टर्स उपयोगकर्ता खाते आवेदन में चलाता है के उपयोगकर्ता प्रोफ़ाइल में प्रमाण पत्र आयात करने का प्रयास कई बार, ASP.NET और COM + अनुप्रयोगों ग्राहकों का रूप धारण।। जब वे करते हैं, तो वे प्रदर्शन कारणों से प्रतिरूपित उपयोगकर्ता के लिए उपयोगकर्ता प्रोफ़ाइल लोड नहीं करते हैं। इसलिए, वे प्रतिरूपित उपयोगकर्ता के लिए "उपयोगकर्ता" प्रमाणपत्र स्टोर तक नहीं पहुंच सकते हैं।

उपयोगकर्ता प्रोफ़ाइल लोड हो रहा है त्रुटि को हल किया गया।

+0

प्रश्न में कोड का टुकड़ा डेस्कटॉप एप्लिकेशन के अंदर चल रहा था, इसलिए मुझे संदेह है कि एक अनलोडेड उपयोगकर्ता प्रोफ़ाइल समस्या पर थी। –

+0

@Zain, उत्तर के लिए धन्यवाद। क्या आप यह भी जानते हैं कि इस मुद्दे को ठीक करने का यह सबसे अच्छा तरीका है? यह प्रदर्शन प्रभाव के कारण मुझे विचार करता है। Thx – curiousBoy

+0

@curiousBoy जैसा मैंने अपने उत्तर की आखिरी पंक्ति में कहा, उपयोगकर्ता प्रोफाइल लोड करने के लिए एक एपीआई कॉल करें। –

4

विंडोज 2012 पर एक वेब एप्लिकेशन में इसे चलाने में, एप्लिकेशन पूल विकल्प Load User Profile सेट करने से यह सच हो गया।

ऐसा करने के लिए, inetmgr.exe चलाएं, सही अनुप्रयोग पूल के लिए Advanced Settings पर जाएं, Load User ProfileProcess Model के तहत सत्य में बदलें।

+0

यह डेस्कटॉप एप्लिकेशन में हुआ, न कि वेब एप्लिकेशन या सेवा। –

1

मुझे यह समस्या थी।

  1. साइट होस्ट करने वाले सर्वर पर ओपन आईआईएस।
  2. साइट के लिए एप्लिकेशन पूल खोजें।
  3. उन्नत सेटिंग्स पर क्लिक करें।
  4. "उपयोगकर्ता प्रोफ़ाइल लोड करें" को सही में बदलें। (पुनरारंभ या रीबूट की आवश्यकता हो सकती है)

यह crypto subsystem काम करने की अनुमति देता है।

enter image description here

+1

यह चौथा उत्तर है जो आईआईएस ऐप पूल के साथ समस्याओं का संकेत देता है। मुझे डेस्कटॉप ऐप में यह समस्या थी। यह पूरी तरह से संभव है कि उपयोगकर्ता प्रोफ़ाइल किसी भी तरह क्षतिग्रस्त हो गई थी, लेकिन यह निश्चित रूप से लोड किया गया था। –

+0

दिलचस्प, यह आपके प्रश्न से स्पष्ट नहीं है कि यह एक डेस्कटॉप ऐप है। यह फिक्स मेरे पहचान सर्वर 3 एमवीसी ऐप पर मेरे लिए काम किया। परियोजना ने स्थानीय रूप से ठीक काम किया, लेकिन जैसे ही यह सर्वर तक पहुंचा, यह दुर्घटनाग्रस्त हो जाएगा। यह ध्वज एकमात्र फिक्स था। शायद डेस्कटॉप ऐप पर अनुमतियां? – paqogomez

+0

यह एक एक्सपी मशीन पर व्यवस्थापक-समूह खाते में चलाया गया, इसलिए न तो अनुमतियां और न ही यूएसी मुद्दे पर होना चाहिए था। मैं इसे किसी भी अन्य मशीन पर पुन: उत्पन्न नहीं कर सका, इसलिए इस बिंदु पर मेरा सबसे अच्छा अनुमान या तो टूटा प्रोफाइल या टूटा ओएस कॉन्फ़िगरेशन है। –