2009-02-17 14 views
9

मेरे पास एक एएसपी.नेट वेब सेवा है जो एक बाइट सरणी प्राप्त कर रही है जो फ़ाइल की सामग्री का प्रतिनिधित्व करती है जिसमें X.50 9 प्रमाणपत्र है। सर्वर-साइड कोड बाइट्स से प्रमाणपत्र लोड करने के लिए System.Security.Cryptography.X509Certificate2 निर्माता उपयोग कर रहा है:X509Certificate2 कभी-कभी ब्लॉब से बनाने में विफल क्यों होता है?

X509Certificate2 native_cert = new X509Certificate2(
       pkcs12_buf /*byte array*/, 
       password, 
       X509KeyStorageFlags.PersistKeySet | 
       X509KeyStorageFlags.Exportable 
      ); 

जो मेरी सेवा प्रक्रिया के रूप में चल रहा है के आधार पर, इस कॉल या तो सफल होगा, या एक "आंतरिक त्रुटि" अपवाद के साथ असफल । अपवाद स्टैक पर अंतिम कॉल X509Utils._LoadCertFromBlob है, जो mscore.dll में अप्रबंधित कोड है।

सेवा कोड के क्रेडेंशियल का उपयोग कर एक इंटरैक्टिव लॉगिन में कंसोल एप्लिकेशन से चलाते समय यह कोड सफल होता है। सर्विस खाते के क्रेडेंशियल्स का उपयोग करने वाले एप्लिकेशन पूल में w3wp.exe के तहत चलते समय यह विफल हो जाता है। व्यवस्थापक को ऐप पूल पहचान बदलना समस्या को हल करता है, इसलिए यह एक विशेषाधिकार मुद्दा होना चाहिए, लेकिन मुझे नहीं पता कि इसके लिए विशेषाधिकार क्या आवश्यक हो सकता है। कोड या तो फाइल सिस्टम या विंडोज प्रमाणपत्र स्टोर को स्पर्श नहीं करता है।

[अद्यतन: अधिक जानकारी]
यह त्रुटि Windows ईवेंट लॉग में प्रकट होता है:

*Cryptographic Parameters:* 
**Provider Name:** Microsoft Software Key Storage Provider 
**Algorithm Name:** Not Available. 
**Key Name:** {E182E13B-166D-472A-A24A-CBEF0808E9ED} 
    **Key Type:** User key. 

*Cryptographic Operation:* 
**Operation:** Open Key. 
    **Return Code:** 0x2 

कोई भी विचार?

उत्तर

8

मैं सिर्फ इस एक का हल अपने आप को पाया:

X509KeyStorageFlags flags = X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet; 

X509Certificate2 cert = new X509Certificate2(pkcs12_buf, password, flags); 

चाल यहाँ उपयोगकर्ता प्रोफ़ाइल कुंजी स्टोर के बजाय स्थानीय कुंजी स्टोर MachineKeySet ध्वज का उपयोग करना है, जो डिफ़ॉल्ट है यदि आप वैकल्पिक स्थान निर्दिष्ट नहीं करते हैं। चूंकि एएसपी.नेट प्रक्रिया पहचान उपयोगकर्ता प्रोफ़ाइल स्टोर को लोड नहीं करती है, इसलिए प्रोग्राम को प्रोग्रामेटिक रूप से आयात करते समय आप स्टोर तक नहीं पहुंच सकते हैं, लेकिन आप मशीन स्टोर तक पहुंच सकते हैं।

मुझे लगता है कि PersistKeySet सिर्फ निजी कुंजी लोड हो जाता है, लेकिन मुझे यकीन नहीं है कि यह वास्तव में क्या करता है - यदि आपको किसी कारण से निजी कुंजी तक पहुंचने की आवश्यकता है तो यह आवश्यक है।

+0

आपके द्वारा चलाए जाने वाले एएसपी.Net उपयोगकर्ता संदर्भ के लिए अपने स्टोर तक पहुंच क्यों नहीं होगी? (इससे मेरी समस्या हल हो गई - यह एक क्लासिक था "लेकिन यह मेरी देव मशीन पर काम करता है! तर्क के बारे में सिर्फ उत्सुक है।) – DFTR

2

निम्न फ़ोल्डर के लिए ASP.NET खाता अनुमतियां प्रदान करने का प्रयास करें: C:\Documents And Settings\All Users\Microsoft\Crypto\RSA\MachineKeys\ (अपने वातावरण के अनुसार भिन्न हो सकते हैं)

+0

मुझे लगता है कि आप सही रास्ते पर हैं, लेकिन ऐसा लगता है कि यह फाइल सिस्टम तक पहुंचने का प्रयास नहीं कर रहा है। जो खाता सफल होता है वह उपयोगकर्ता की व्यक्तिगत प्रोफ़ाइल (AllUsers नहीं) के तहत Microsoft \ Crypto \ RSA तक पहुंचता है। जो विफल रहता है वह प्रोसेम के मुताबिक फाइल सिस्टम तक पहुंचने की कोशिश नहीं कर रहा है। – jlew

+0

यह अनुमति परिवर्तन Win2k8 पर मेरे लिए काम किया। मुझे समय डिबगिंग का एक गुच्छा बचाया। धन्यवाद! – CodingWithSpike

संबंधित मुद्दे