CryptographicException "مجموعة المفاتيح غير موجودة"، ولكن فقط من خلال WCF

StackOverflow https://stackoverflow.com/questions/602345

  •  03-07-2019
  •  | 
  •  

سؤال

لدي بعض التعليمات البرمجية التي تجري اتصالاً بخدمة ويب تابعة لجهة خارجية مؤمنة باستخدام شهادة X.509.

إذا قمت باستدعاء الكود مباشرة (باستخدام اختبار الوحدة) فإنه يعمل دون أي مشاكل.

عند النشر، سيتم استدعاء هذا الرمز عبر خدمة WCF.لقد قمت بإضافة اختبار وحدة ثانية يستدعي خدمة WCF، ولكن هذا فشل مع ملف CryptographicException, ، رسالة "Keyset does not exist" عندما أقوم باستدعاء طريقة ما على خدمة ويب تابعة لجهة خارجية.

أفترض أن السبب في ذلك هو أن خدمة WCF الخاصة بي ستحاول الاتصال بخدمة الويب التابعة لجهة خارجية باستخدام مستخدم مختلف لنفسي.

هل يمكن لأي شخص إلقاء أي ضوء إضافي على هذه القضية؟

هل كانت مفيدة؟

المحلول

ومن المرجح أن يكون مشكلة أذونات على الشهادة.

عند تشغيل اختبار وحدة كنت على وشك أن تنفيذ تلك تحت سياق المستخدم الخاص بك، والتي (اعتمادا على ما تخزين <م> العميل الشهادة في) سيكون لديك الوصول إلى المفتاح الخاص الذي الشهادة.

ولكن إذا تم استضافة خدمة WCF الخاص بك تحت IIS، أو باعتبارها خدمة ويندوز فمن المحتمل أنه سيتم تشغيل تحت حساب خدمة (خدمة الشبكة، الخدمة المحلية أو بعض الاعتبار تقتصر آخر).

وسوف تحتاج إلى تعيين الأذونات المناسبة على مفتاح خاص للسماح أن الوصول إلى حساب خدمة لها. MSDN ديه تفاصيل

نصائح أخرى

هذا على الأرجح لأن مستخدم IIS لا يملك حق الوصول إلى المفتاح الخاص لشهادتك.يمكنك ضبط ذلك باتباع الخطوات التالية...

  1. ابدأ -> تشغيل -> MMC
  2. ملف -> إضافة/إزالة الأداة الإضافية
  3. قم بإضافة الشهادات الإضافية
  4. حدد حساب الكمبيوتر، ثم اضغط على التالي
  5. حدد "الكمبيوتر المحلي" (الافتراضي)، ثم انقر فوق "إنهاء".
  6. على اللوحة اليسرى من جذر وحدة التحكم ، انتقل إلى الشهادات (الكمبيوتر المحلي) -> الشخصية -> الشهادات
  7. من المرجح أن تكون شهادتك هنا.
  8. انقر بزر الماوس الأيمن على شهادتك -> جميع المهام -> إدارة المفاتيح الخاصة
  9. اضبط إعدادات المفتاح الخاص هنا.

ولقد كان قضية مماثلة الليلة الماضية. تم تعيين الأذونات على المفتاح الخاص بشكل صحيح، كل شيء كان على ما يبدو على ما يرام باستثناء مجموعة المفاتيح غير موجود خطأ. في النهاية اتضح أن الشهادة تم استيرادها إلى مخزن المستخدم الحالي أولا ثم انتقل إلى مخزن الجهاز المحلي. ومع ذلك - لم لا تتحرك المفتاح الخاص، الذي كان لا يزال في

وC: \ الوثائق وsettngs \ مدير ...

وبدلا من

وC: \ الوثائق وsettngs \ جميع المستخدمين ...

وألطاف تم تعيين الأذونات على المفتاح بشكل صحيح، ASPNET لا يمكن الوصول إليه. عندما كنا شهادة إعادة المستوردة بحيث يتم وضع المفتاح الخاص في المستخدمين فرع جميع، اختفت المشكلة.

لحل مشكلة "مجموعة المفاتيح غير موجودة" عند التصفح من IIS: قد يكون للحصول على إذن خاص

للعرض وإعطاء الإذن:

  1. تشغيل > mmc > نعم
  2. انقر على الملف
  3. انقر فوق إضافة/إزالة الأداة الإضافية...
  4. انقر مرتين على الشهادة
  5. حساب الكمبيوتر
  6. التالي
  7. ينهي
  8. نعم
  9. انقر فوق الشهادات (الكمبيوتر المحلي)
  10. انقر على الشخصية
  11. انقر فوق الشهادات

لإعطاء الإذن:

  1. انقر بزر الماوس الأيمن على اسم الشهادة
  2. جميع المهام>إدارة المفاتيح الخاصة...
  3. إضافة الامتياز ومنحه (إضافة IIS_IUSRS ومنحه الامتياز يعمل بالنسبة لي)

وكان نفس المشكلة أثناء محاولة تشغيل التطبيق WCF من برنامج Visual Studio. حلها من قبل بتشغيل Visual Studio كمسؤول.

لقد واجهت هذه المشكلة، حيث تحتوي شهاداتي على مفتاح خاص ولكني كنت أتلقى هذا الخطأ ("مجموعة المفاتيح غير موجودة")

سبب: يعمل موقع الويب الخاص بك ضمن حساب "خدمات الشبكة" أو يتمتع بامتيازات أقل.

حل:قم بتغيير هوية تجمع التطبيقات إلى "النظام المحلي"، ثم أعد تعيين IIS وتحقق مرة أخرى.إذا بدأ العمل، فهذه مشكلة إذن/امتياز أقل، يمكنك انتحال الشخصية ثم استخدام حسابات أخرى أيضًا.

ومحبطة تماما، وكان لي نفس المشكلة وحاولت أكثر من أعلاه. وكان الشهادة التي تم تصديرها بشكل صحيح أذونات لقراءة الملف في C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys، ولكن كما اتضح أنه لم يكن لديك إذن على المجلد. وأضاف أنه وعملت

ولدي مشكلة مماثلة تماما أيضا. ولقد استخدمت الأمر

findprivatekey root localmachine -n "CN="CertName" 

والنتيجة تشير الى ان المفتاح الخاص هو في المجلد c: \ ProgramData بدلا من C: \ الوثائق وsettngs \ جميع المستخدمين ..

عند I حذف المفتاح من المجلد c: ProgramData \، مرة أخرى تشغيل لم ينجح الأمر findPrivatekey. بمعنى آخر. لم يتم العثور على مفتاح.

ولكن لو كنت ابحث في نفس المفتاح عاد بأمر سابق، أنا لا تزال تجد المفتاح في

وC: \ الوثائق وsettngs \ جميع المستخدمين ..

وذلك لفهمي، IIS أو WCF استضافت لم يتم العثور على المفتاح الخاص من C: \ الوثائق وsettngs \ جميع المستخدمين ..

وكنت الحصول على الخطأ: CryptographicException "مجموعة المفاتيح غير موجود" عندما تشغيل التطبيق MVC.

والحل هو: منح حق الوصول إلى الشهادات الشخصية لحساب تجمع التطبيقات قيد التشغيل في إطار. في حالتي كان لإضافة 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. 

ولقد وجدت بعض المعلومات الناقصة التي ساعدتني الحصول على خدمة WCF بلدي مع مستوى الأمن رسالة الماضية "مجموعة المفاتيح غير موجود" التي ظللت الوقوع على الرغم من منح الأذونات على كافة المفاتيح المتولدة من الأمثلة على شبكة الإنترنت.

وأخيرا استيراد المفتاح الخاص في مخزن الناس الموثوق بها على الجهاز المحلي ثم منح المفتاح الخاص الأذونات الصحيحة.

وهذا ليس صحيحا في الفراغات بالنسبة لي وسمح لي أخيرا لتنفيذ خدمة WCF مع أمن مستوى الرسالة. أنا بناء WCF التي يجب أن تكون متوافقة HIPPA.

إذا كنت تستخدم ApplicationPoolIdentity لتجمع التطبيقات الخاصة بك، قد يكون لديك مشكلة مع تحديد إذن لهذا المستخدم "افتراضية" في محرر التسجيل (ليس هناك مثل هذا المستخدم في النظام).

وهكذا، استخدم subinacl - أداة سطر الأوامر التي يمكن التسجيل مجموعة ACL، وأو شيء من هذا القبيل.

وأنا فقط أريد أن أضيف إجابة الاختيار التعقل. كنت الحصول على نفس الخطأ المحدد حتى بعد تثبيت الشهادات على مخازن اليمنى على آلات بلدي وجود جميع امتيازات الأمان المناسبة للعميل. تبين لي اختلطت بلدي clientCertificate وشهادة خدمة بلدي. إذا كنت قد حاولت كل ما سبق، وأود أن مضاعفة التحقق من أن لديك تلك مباشرة اثنين. مرة واحدة فعلت ذلك، طلبي دعا بنجاح خدمة ويب. مرة أخرى، مجرد المدقق التعقل.

وتلقيت هذا الخطأ أثناء استخدام Fedlet openAM على IIS7

وتغيير حساب المستخدم للموقع الافتراضي حل المشكلة. من الناحية المثالية، فإن كنت تريد أن يكون حساب الخدمة. ربما الحساب IUSR. أقترح تبحث عن طرق لIIS تصلب مسمار عليه تماما.

وأنا ضربت هذا في مشروع النسيج خدمتي بعد سيرت المستخدمة لمصادقة ضد لدينا قبو رئيسيا انتهت واستدارة، التي غيرت بصمة الإبهام. حصلت على هذا الخطأ لأنني كنت قد غاب تحديث بصمة الإبهام في ملف applicationManifest.xml في هذه الكتلة التي لا بالضبط ما قد اقترح إجابات أخرى - لإعطاء خدمة الشبكة (التي تعمل كل ما عندي من إإكسس كما، التكوين القياسي لمجموعة servicefabric الزرقاء) أذونات الوصول إلى 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 -->

وأنا فقط إعادة تثبيت شهادتي في الجهاز المحلي ومن ثم فإنه يعمل بشكل جيد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top