CryptographicException 'Keyset मौजूद नहीं है', लेकिन केवल WCF के माध्यम से


157

मेरे पास कुछ कोड हैं जो X.509 प्रमाणन का उपयोग करके सुरक्षित तृतीय पक्ष की वेब सेवा पर कॉल करता है।

अगर मैं कोड को सीधे (एक इकाई परीक्षण का उपयोग करके) कहता हूं तो यह बिना किसी समस्या के काम करता है।

जब तैनात किया जाता है, तो इस कोड को डब्ल्यूसीएफ सेवा के माध्यम से बुलाया जाएगा। मैंने एक दूसरी इकाई परीक्षण जोड़ा है जो डब्ल्यूसीएफ सेवा को कॉल करता है, हालांकि जब मैं तीसरी वेब वेब सेवा पर एक विधि को कॉल करता हूं CryptographicException, तो यह संदेश के साथ विफल हो जाता है "Keyset does not exist"

मुझे लगता है कि ऐसा इसलिए है क्योंकि मेरी WCF सेवा अपने लिए एक अलग उपयोगकर्ता का उपयोग करके तृतीय पक्ष वेब सेवा को कॉल करने का प्रयास करेगी।

क्या कोई इस मुद्दे पर कोई अतिरिक्त प्रकाश डाल सकता है?

जवाबों:


168

यह संभवतः प्रमाणपत्र पर अनुमतियों की समस्या होगी।

एक इकाई परीक्षण चलाते समय आप अपने स्वयं के उपयोगकर्ता संदर्भ के तहत उन पर अमल करने जा रहे हैं, जो ( ग्राहक की दुकान पर निर्भर करता है) प्रमाण पत्र है) उस प्रमाणपत्र की निजी कुंजी तक पहुंच होगी।

हालाँकि, यदि आपकी WCF सेवा IIS के तहत होस्ट की गई है, या Windows सेवा के रूप में इसकी संभावना है कि यह एक सेवा खाते (नेटवर्क सेवा, स्थानीय सेवा या कुछ अन्य प्रतिबंधित खाते) के तहत चल रही होगी।

आपको उस सेवा खाते तक पहुँच की अनुमति देने के लिए निजी कुंजी पर उपयुक्त अनुमतियाँ सेट करने की आवश्यकता होगी। MSDN का विवरण है


रनिंग बछड़ों ने मुझे एक पूरी तरह से अलग मुद्दे के लिए धन्यवाद दिया
जॉन

3
मैं अपने एपीपी को चलाने के लिए प्रशासक के रूप में मुद्दा चला गया है।
डेरेक

1
MSDN प्रलेखन के लिए +1 और सूचीबद्ध चरण एक वेब अनुप्रयोग पर भी लागू होते हैं
नरेन

प्रमाणपत्र सुरक्षा अनुमतियों के लिए "नेटवर्क सेवा" जोड़कर मेरे लिए यह हल किया, धन्यवाद!
OpMt

276

यह सबसे अधिक संभावना है क्योंकि IIS उपयोगकर्ता के पास आपके प्रमाणपत्र के लिए निजी कुंजी तक पहुंच नहीं है। इन स्टेप्स को फॉलो करके आप इसे सेट कर सकते हैं ...

  1. स्टार्ट -> रन -> एमएमसी
  2. फ़ाइल -> स्नैपिन जोड़ें / निकालें
  3. सर्टिफिकेट स्नैप इन जोड़ें
  4. कंप्यूटर अकाउंट चुनें, फिर अगला हिट करें
  5. स्थानीय कंप्यूटर (डिफ़ॉल्ट) का चयन करें, फिर समाप्त पर क्लिक करें
  6. कंसोल रूट से बाएं पैनल पर, प्रमाणपत्र (स्थानीय कंप्यूटर) पर नेविगेट करें -> व्यक्तिगत -> प्रमाण पत्र
  7. आपका प्रमाणपत्र सबसे अधिक संभावना है।
  8. अपने प्रमाणपत्र पर राइट क्लिक करें -> सभी कार्य -> ​​निजी कुंजी प्रबंधित करें
  9. अपनी निजी कुंजी सेटिंग यहां सेट करें।

1
वर्थ यह देखते हुए कि यह सर्वर 2003 पर एक विकल्प नहीं है, जब तक कि मेरा वातावरण निराला कॉन्फ़िगर नहीं किया गया है। मैं विंडोज 7 पर ऐसा कर सकता हूं।
शॉन हबर्ड

आप यहाँ निजी कुंजी सेट के साथ क्या मतलब है ?? मेरा मतलब है कि आप उपयोगकर्ता को केवल एक्सेस अधिकार के साथ जोड़ सकते हैं! '
mastervv

10
धन्यवाद, बस यह इंगित करना चाहता था कि यदि आप iis7.5 का उपयोग करते हैं और एप्लिकेशन पूल अनुप्रयोगात्मकता के रूप में चलता है, तो आपको फ़ाइल के लिए IIS AppPool \ DefaultAppPool उपयोगकर्ता अनुमतियाँ देनी होंगी। इससे मेरे लिए समस्या ठीक हो गई।
रॉनन फिस्टिंगर जुले

25
मुझे IIS_IUSRS के लिए अनुमति देनी थी ताकि वह मेरे लिए काम कर सके।
TrueEddie

1
यदि आप IIS एक्सप्रेस चलाते समय इसे प्राप्त कर रहे हैं, तो आपको अपनी लॉगिन अनुमति देने की आवश्यकता है।
Jez

38

मैं कल रात को समान मुद्दा था। निजी कुंजी पर अनुमतियाँ सही ढंग से सेट की गईं, सब कुछ स्पष्ट रूप से ठीक था सिवाय इसके किसेट में कोई त्रुटि नहीं है। अंत में यह पता चला कि प्रमाणपत्र वर्तमान उपयोगकर्ता स्टोर पर पहले आयात किया गया था और फिर स्थानीय मशीन स्टोर में स्थानांतरित कर दिया गया था। हालाँकि - यह निजी कुंजी को स्थानांतरित नहीं करता था, जो अभी भी था

C: \ Documents और Settngs \ Administrator ...

के बजाय

C: \ दस्तावेज़ और सभी उपयोगकर्ता ...

कुंजी पर पर्याप्त अनुमतियाँ सही ढंग से सेट की गई थीं, ASPNET इसे एक्सेस नहीं कर सका। जब हमने प्रमाणपत्र को फिर से आयात किया ताकि निजी कुंजी को सभी उपयोगकर्ताओं की शाखा में रखा जाए, तो समस्या गायब हो गई।


एक ही समस्या है। Microsoft को सुरक्षा बोजोस को चलाने की अनुमति देने से रोकने की आवश्यकता है।
पॉल स्टोवेल

2
3 खो घंटे के बाद, यह मेरी समस्या हल करता है - धन्यवाद। मैंने FindPStreetKey नमूने का उपयोग किया , और यह उलझन में था कि यह MMC स्नैप-इन के माध्यम से LocalMachine में दिखाई देने पर भी मेरे उपयोगकर्ता के कीस्टोर में क्यों दिखाई दिया।
रोब पॉटर

मैं आपको उन घंटों के लिए एक बीयर खरीदूंगा जो अनुमतियों के साथ खिलवाड़ करते हैं जैसे कि हर दूसरे उत्तर ने मुझे बताया।
स्कॉट स्काउडन

धन्यवाद धन्यवाद धन्यवाद! मैंने अपने जीवन के लगभग 2.5 घंटे इस डरावने मुद्दे के लिए खो दिए हैं और मुझे यकीन है कि अगर मैंने यह नहीं देखा तो मुझे 2.5 दिन गंवाने पड़ेंगे।
फ्रैंक ताज़बेटिस

मेरे पास उल्टा ही मुद्दा था। पहले लोकल मशीन में, फिर करंट यूजर में इंस्टॉल किया गया। सभी स्टोर्स को दोनों स्टोर से हटाना और करंट यूजर के तहत रीइंस्टॉल करना तय है।
बार्ट वेरकोइजेन

24

IIS से ब्राउज़ करते समय "कीसेट मौजूद नहीं है" को हल करने के लिए: यह निजी अनुमति के लिए हो सकता है

अनुमति देखने और देने के लिए:

  1. भागो> एमएमसी> हाँ
  2. फ़ाइल पर क्लिक करें
  3. स्नैप-इन जोड़ें / निकालें पर क्लिक करें
  4. प्रमाणपत्र पर डबल क्लिक करें
  5. कंप्यूटर खाता
  6. आगे
  7. समाप्त
  8. ठीक
  9. प्रमाणपत्र (स्थानीय कंप्यूटर) पर क्लिक करें
  10. Personal पर क्लिक करें
  11. प्रमाण पत्र पर क्लिक करें

अनुमति देने के लिए:

  1. प्रमाणपत्र के नाम पर राइट क्लिक करें
  2. सभी कार्य> निजी कुंजी प्रबंधित करें ...
  3. विशेषाधिकार जोड़ें और (IIS_IUSRS जोड़कर और यह विशेषाधिकार मेरे लिए काम करता है) दें

1
यदि आप एक ऐप पूल के तहत चल रहे हैं, तो इस उपयोगकर्ता को "IIS AppPool \ DefaultAppPool" के बजाय जोड़ें
समीर अलीभाई

इससे मुझे भी मदद मिली है। जैसे ही मैंने IIS_IUSRS को अनुमति दी, इसने काम करना शुरू कर दिया।
मोहर

18

विजुअल स्टूडियो से WCF ऐप चलाने की कोशिश के दौरान भी यही समस्या थी। विजुअल स्टूडियो को व्यवस्थापक के रूप में चलाकर इसे हल किया।


11

मुझे इस समस्या का सामना करना पड़ा है, मेरे प्रमाणपत्र जहां निजी कुंजी रखते हैं, लेकिन मुझे यह त्रुटि मिल रही थी ( "कीसेट मौजूद नहीं है" )

कारण: आपकी वेब साइट "नेटवर्क सेवाओं" खाते के तहत चल रही है या कम विशेषाधिकार प्राप्त कर रही है।

समाधान : एप्लिकेशन पूल पहचान को "स्थानीय सिस्टम" में बदलें, IIS रीसेट करें और फिर से जांचें। यदि यह काम करना शुरू कर देता है तो यह अनुमति / कम विशेषाधिकार का मुद्दा है, तो आप अन्य खातों का भी उपयोग कर सकते हैं।


8

पूरी तरह से निराशाजनक, मेरे पास एक ही मुद्दा था और ऊपर दिए गए अधिकांश प्रयास किए। निर्यात किए गए प्रमाण पत्र में फ़ाइल को पढ़ने के लिए सही तरीके से अनुमति थी C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys, हालांकि यह पता चला है कि फ़ोल्डर में इसकी अनुमति नहीं थी। इसे जोड़ा और यह काम किया


मैंने इस मुद्दे को हल करने के लिए बहुत सी चीजों की कोशिश की, लेकिन यह एक चाल है!
ग्युम फॉक्स

वाह - उम्मीद नहीं थी कि काम करने के लिए लेकिन यह किया है। मैं जोड़ा IISAPPPool\www.mywebsite.comजो खिड़कियों मेरी appool लिए उपयोगकर्ता नाम और यह काम किया :-)
Simon_Weaver

किसी को पता है कि यह क्यों काम करता है? कुछ भ्रष्ट है क्योंकि यह बहुत अस्पष्ट है
साइमन_वेवर

यह मत करो! सर्वर "खराब स्थिति" में आ जाता है, जहां फ़ोल्डर आयात किया जा रहा है और "Microsoft सॉफ़्टवेयर KSP" प्रदाता प्रकार के साथ दिखाई दे रहा है जब फ़ोल्डर ..RSA \ MachineKeys की आधार अनुमतियां बदल गई हैं। अधिक जानकारी reddit.com/r/sysadmin/comments/339ogk/...
धनुका Jan।

3

मेरी भी ठीक ऐसी ही समस्या है। मैंने कमांड का उपयोग किया है

findprivatekey root localmachine -n "CN="CertName" 

परिणाम से पता चलता है कि निजी कुंजी सी: \ ProgramData फ़ोल्डर में C: \ Documents और बजाए सभी उपयोगकर्ता के है ..

जब मैं c: \ ProgramData फ़ोल्डर से कुंजी को हटाता हूं, तो फिर से चलाएँपेंडेटरीकी कमांड सफल नहीं होती है। अर्थात। यह कुंजी नहीं खोजता है।

लेकिन अगर मैं उसी कमांड को पहले के कमांड से लौटाता हूं, तब भी मैं कुंजी को खोज सकता हूं

C: \ दस्तावेज़ और सभी उपयोगकर्ता \ _

तो मेरी समझ में, IIS या होस्ट किया गया WCF C: \ Documents और setngs \ All सर्वर से निजी कुंजी नहीं ढूंढ रहा है।


2
हाय यह लिंक आपको बताएगा कि इस समस्या को कैसे हल किया जाए और यह भी खोजक उपकरण का पता लगाएं : blogs.msdn.microsoft.com/dsnotes/2015/08/13/…
ताहिर खालिद

3

मुझे त्रुटि मिल रही थी: MVC एप्लिकेशन चलाने पर CryptographicException 'Keyset मौजूद नहीं है'।

समाधान यह था: व्यक्तिगत प्रमाण पत्र तक पहुंच प्रदान करने के लिए कि आवेदन पूल के तहत चल रहा है। मेरे मामले में यह IIS_IUSRS को जोड़ना और सही स्थान चुनना इस मुद्दे को हल करना था।

RC on the Certificate - > All tasks -> Manage Private Keys -> Add->  
For the From this location : Click on Locations and make sure to select the Server name. 
In the Enter the object names to select : IIS_IUSRS and click ok. 

2

स्टीव शेल्डन के उत्तर ने मेरे लिए समस्या तय कर दी, हालाँकि, जैसा कि मैं एक गुई के साथ प्रमाण पत्र की अनुमति की स्क्रिप्टिंग कर रहा हूं, मुझे एक स्क्रिप्ट योग्य समाधान की आवश्यकता थी। मुझे यह पता लगाने के लिए संघर्ष करना पड़ा कि मेरी निजी कुंजी कहाँ संग्रहीत है। निजी कुंजी में नहीं था -C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys, अंततः मैंने पाया कि यह वास्तव में थाC:\ProgramData\Microsoft\Crypto\Keys । नीचे मैंने बताया कि मैंने कैसे पाया कि बाहर:

मैंने कोशिश की, FindPrivateKeyलेकिन यह निजी कुंजी नहीं ढूंढ सका, और शक्तियों का उपयोग करके$cert.privatekey.cspkeycontainerinfo.uniquekeycontainername शून्य / खाली था।

सौभाग्य से, certutil -store myप्रमाण पत्र को सूचीबद्ध किया और मुझे विवरण दिया जो मुझे समाधान की स्क्रिप्ट करने के लिए आवश्यक था।

================ Certificate 1 ================ Serial Number: 162f1b54fe78c7c8fa9df09 Issuer: CN=*.internal.xxxxxxx.net NotBefore: 23/08/2019 14:04 NotAfter: 23/02/2020 14:24 Subject: CN=*.xxxxxxxnet Signature matches Public Key Root Certificate: Subject matches Issuer Cert Hash(sha1): xxxxa5f0e9f0ac8b7dd634xx Key Container = {407EC7EF-8701-42BF-993F-CDEF8328DD} Unique container name: 8787033f8ccb5836115b87acb_ca96c65a-4b42-a145-eee62128a ##* ^-- filename for private key*## Provider = Microsoft Software Key Storage Provider Private key is NOT plain text exportable Encryption test passed CertUtil: -store command completed successfully.

मैंने फिर स्कैन किया c\ProgramData\Microsoft\Crypto\ फ़ोल्डर और फ़ाइल को C: \ ProgramData \ Microsoft \ Crypt \ Keys में 8787033f8ccb5836115b87acb_ca96c65a-4b42-a145-eee62128a मिला।

मेरे सेवा खाते को पढ़ने के लिए इस फ़ाइल का उपयोग करना मेरे लिए समस्याएँ तय करता है


1
मेरी समस्या को हल करने के लिए "प्रमाणित -स्टोर माय-स्टोर" का उपयोग करना महत्वपूर्ण था। मैंने फ़ाइल का पता लगाने के लिए "यूनीक कंटेनर नाम" का उपयोग किया और सर्टिफिकेट फ़ाइल पर "एक्सेस अस्वीकृत" त्रुटि का निवारण करने के लिए Sysinternals Process Monitor का उपयोग किया। मेरे मामले में मुझे NT अथॉरिटी \ IUSR उपयोगकर्ता के लिए सर्टिफिकेट फ़ाइल को रीड एक्सेस प्रदान करना था।
hsop

1

मुझे कुछ मिसिंग जानकारी मिली, जिसने मुझे "स्तर की मौजूदगी नहीं है" संदेश स्तर की सुरक्षा के साथ मेरी WCF सेवा प्राप्त करने में मदद की, जिसे मैं इंटरनेट पर उदाहरणों से उत्पन्न सभी कुंजी को अनुमति देने के बावजूद चालू रखता था।

मैंने आखिरकार निजी मशीन को स्थानीय मशीन पर भरोसेमंद लोगों के स्टोर में आयात किया और फिर निजी कुंजी को सही अनुमति दी।

यह मेरे लिए रिक्त स्थान भर गया और आखिरकार मुझे संदेश स्तर सुरक्षा के साथ WCF सेवा को लागू करने की अनुमति दी। मैं एक WCF का निर्माण कर रहा हूँ जो HIPPA के अनुरूप होना चाहिए।


1

मैंने अभी स्थानीय मशीन में अपने प्रमाणपत्र को फिर से स्थापित किया है और फिर यह ठीक काम कर रहा है


0

यदि आप अपने एप्लिकेशन पूल के लिए ApplicationPoolIdentity का उपयोग करते हैं, तो आपको रजिस्ट्री संपादक में उस "वर्चुअल" उपयोगकर्ता के लिए अनुमति निर्दिष्ट करने में समस्या हो सकती है (सिस्टम में ऐसा कोई उपयोगकर्ता नहीं है)।

इसलिए, सबइनक्ल - कमांड-लाइन टूल का उपयोग करें जो सेट की गई रजिस्ट्री ACL को सक्षम करता है, या ऐसा कुछ।


0

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


0

IIS7 पर OpenAM Fedlet का उपयोग करते समय यह त्रुटि मिली

डिफ़ॉल्ट वेबसाइट के लिए उपयोगकर्ता खाते को बदलने से समस्या हल हो गई। आदर्श रूप में, आप चाहते हैं कि यह एक सेवा खाता हो। शायद IUSR खाता भी। यह पूरी तरह से नीचे कील करने के लिए IIS सख्त के लिए तरीकों की तलाश का सुझाव दें।


0

मैंने अपनी सर्विस फैब्रिक परियोजना में इस हिट के बाद सर्टिफिकेट का इस्तेमाल किया जो कि हमारी प्रमुख वॉल्ट की समय सीमा समाप्त होने के बाद प्रमाणित किया गया और घुमाया गया, जिसने थंबप्रिंट को बदल दिया। मुझे यह त्रुटि मिली क्योंकि मैं इस ब्लॉक में ApplicationManifest.xml फ़ाइल में थंबप्रिंट को अपडेट करने से चूक गया था, जो ठीक उसी तरह से है जो अन्य उत्तरों ने सुझाया है - दिए गए NETWORK सेवा (जो कि मेरे सभी एक्स के रूप में चलती है, azure सर्विसबाइक क्लस्टर के लिए मानक कॉन्फिगरेशन) के लिए अनुमतियाँ LOCALMACHINE \ MY प्रमाणित स्टोर स्थान तक पहुँचें।

"X509FindValue" विशेषता मान पर ध्यान दें।

<!-- this block added to allow low priv processes (such as service fabric processes) that run as NETWORK SERVICE to read certificates from the store -->
  <Principals>
    <Users>
      <User Name="NetworkService" AccountType="NetworkService" />
    </Users>
  </Principals>
  <Policies>
    <SecurityAccessPolicies>
      <SecurityAccessPolicy ResourceRef="AzureKeyvaultClientCertificate" PrincipalRef="NetworkService" GrantRights="Full" ResourceType="Certificate" />
    </SecurityAccessPolicies>
  </Policies>
  <Certificates>
    <SecretsCertificate X509FindValue="[[THIS KEY ALSO NEEDS TO BE UPDATED]]" Name="AzureKeyvaultClientCertificate" />
  </Certificates>
  <!-- end block -->


0

यह मेरे लिए एकमात्र समाधान है।

    // creates the CspParameters object and sets the key container name used to store the RSA key pair
    CspParameters cp = new CspParameters();
    cp.KeyContainerName = "MyKeyContainerName"; //Eg: Friendly name

    // instantiates the rsa instance accessing the key container MyKeyContainerName
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
    // add the below line to delete the key entry in MyKeyContainerName
    // rsa.PersistKeyInCsp = false;

    //writes out the current key pair used in the rsa instance
    Console.WriteLine("Key is : \n" + rsa.ToXmlString(true));

संदर्भ १

संदर्भ २


0
This issue is got resolved after adding network service role.

CERTIFICATE ISSUES 
Error :Keyset does not exist means System might not have access to private key
Error :Enveloped data  
Step 1:Install certificate in local machine not in current user store
Step 2:Run certificate manager
Step 3:Find your certificate in the local machine tab and right click manage privatekey and check in allowed personnel following have been added:
a>Administrators
b>yourself
c>'Network service'
And then provide respective permissions.

## You need to add 'Network Service' and then it will start working.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.