دليل مخزن شهادات Windows العمليّ ── المستخدم أم الحاسوب، أين تضعونها
· غو كومورا · شهادات, Windows, أمن, PKI, TLS, PowerShell, تطبيقات الأعمال, نظم المعلومات
«أعدنا تثبيت شهادة العميل للتحقّق من الأهليّة عبر الإنترنت على الجهاز الجديد، وصار لا يتّصل.» «آلة التطوير تبلغ واجهة برمجة البنك جيّداً، لكن بعد أن صارت خدمة Windows تقول «الشهادة غير موجودة».» «لا أستطيع حتّى تمييز أيّ شهادة هي الحقيقيّة — التي يُظهرها certmgr.msc أم التي يُظهرها certlm.msc.» — عندما تبنون تكاملات واجهة برمجة ويب تستخدم شهادات عميل كعمل تطوير برمجيّات مخصّص، يأتي هذا النوع من الاستفسار بانتظام.
التحقّق من الأهليّة عبر الإنترنت في المؤسّسات الصحّيّة، والتقديم الإلكترونيّ، وواجهات برمجة البنوك، وEDI مع شركاء الأعمال. شهادات العميل، التي كانت يوماً حصراً لموظّفي البنية في المنشآت الكبيرة، صارت شيئاً يتولّاه موظّفو تقنيّة المعلومات ومطوّرو تطبيقات الأعمال في المنشآت الصغيرة والمتوسّطة بأنفسهم. وحوادث الشهادات تنحصر فعلاً في حفنة أنماط: وضع الشهادة في المكان الخطأ، ونسيان منح أذون المفتاح الخاصّ، ونسيان الأجل — هذه الثلاثة.
يستهدف المقال مطوّري تطبيقات الأعمال التي تستخدم شهادات عميل، وموظّفي تقنيّة المعلومات الذين يُكلَّفون بأعمال استبدال الشهادات. متمحوراً حول قرار استخدام مخزن المستخدم أم مخزن الحاسوب، يمرّ على كلّ شيء دفعة واحدة — بنية مخزن شهادات Windows، ومنح أذون المفتاح الخاصّ، وجرد الأجل بـ PowerShell، وشيفرة استخدام الشهادة من .NET. المحتوى مستند إلى مصادر أوّليّة من Microsoft Learn حتّى أغسطس 2026.
1. الخلاصة أوّلاً
- مخزن شهادات Windows نظامان: «المستخدم» (CurrentUser) و«الحاسوب» (LocalMachine). مخزن المستخدم منفصل لكلّ حساب (تحت HKEY_CURRENT_USER في السجلّ)، ومخزن الحاسوب مشترك عبر الحاسوب كلّه (تحت HKEY_LOCAL_MACHINE).12
- ثمّة أيضاً أداتا إدارة. يفتح certmgr.msc مخزن المستخدم الحاليّ، ويفتح certlm.msc مخزن الحاسوب المحلّيّ. من PowerShell هما
Cert:\CurrentUserوCert:\LocalMachine.34 - أيّ مخزن يُستخدم يُحسَم بـ«من يعمل البرنامج الذي يستخدم الشهادة بوصفه». كقاعدة، تطبيق مستخدم تفاعليّ يستخدم مخزن المستخدم، والتنفيذ دون مراقبة — خدمة Windows أو IIS أو جدولة المهام — يستخدم مخزن الحاسوب (جدول القرار في الفصل 3).
- «عمل أثناء التطوير لكن لا يُعثَر عليه بعد أن صار خدمة» له سبب يكاد يكون واحداً. شهادة وضعها مطوّر في مخزن مستخدمه غير مرئيّة من CurrentUser لخدمة تعمل تحت حساب آخر (الفصل 3).
- الشهادة ومفتاحها الخاصّ شيئان مختلفان. مجرّد وضع شهادة في مخزن الحاسوب لا يتيح لحساب الخدمة قراءة المفتاح الخاصّ — هذا الوضع العاديّ. امنحوا إذن القراءة لحساب التشغيل عبر «إدارة المفاتيح الخاصّة» في certlm.msc.5
- عند استيراد pfx، يصير المفتاح الخاصّ غير قابل للتصدير افتراضيّاً. لا يستورد
Import-PfxCertificateالمفتاح الخاصّ بشكل يمكن إعادة تصديره ما لم تحدّدوا-Exportable. هذا ليس حادثاً، بل قيمة افتراضيّة مرغوبة.6 - انتهاء الأجل يُمنَع بأتمتة الجرد. يمكن استخراج الشهادات التي تنتهي خلال عدد معيَّن من الأيّام آليّاً مثل
Get-ChildItem Cert:\LocalMachine\My -ExpiringInDays 60.4 - تثبيت بصمة الإبهام (thumbprint) في الشيفرة أو التكوين يموت عند كلّ تحديث شهادة. لأنّ الشهادة الجديدة تتغيّر بصمتها حتماً. إخراج التكوين إلى الخارج + فترة توازٍ للقديم والجديد أساس التصميم (الفصلان 5 و7).
خريطة المعرفة لهذه المقالة
ينقسم مخزن شهادات Windows إلى نظامين: المستخدم (CurrentUser) والحاسوب (LocalMachine)، وأين تُوضَع شهادة العميل يُحسَم بـ«من يعمل ذلك البرنامج بوصفه». خدمة Windows دون مراقبة مجموعة واحدة مع مخزن الحاسوب ومنح أذون المفتاح الخاصّ، وانتهاء أجل الشهادة وبصمة الإبهام المثبَّتة هما السببان الكلاسيكيّان لعطل اتّصال ناجم عن الشهادة.
flowchart LR
accTitle: خريطة معرفة الدليل العمليّ لمخزن شهادات Windows
accDescr: مخطّط يبيّن علاقات مخزن الشهادات (مستخدم/حاسوب)، وشهادة العميل، والمفتاح الخاصّ، وسلسلة الشهادات، ومرجع التصديق الجذريّ والوسيط، وانتهاء الأجل والبصمة وعطل الاتّصال، وإجراء الاستبدال والسجلّ وخطر الشهادة الموقعة ذاتيّاً
certificate_store["مخزن الشهادات"]
client_certificate["شهادة العميل"]
windows_service["خدمة Windows"]
localmachine_store["مخزن شهادات الحاسوب"]
private_key["المفتاح الخاصّ"]
private_key_acl["أذون المفتاح الخاصّ"]
certificate_chain["سلسلة الشهادات"]
intermediate_ca["شهادة مرجع التصديق الوسيط"]
root_ca["شهادة مرجع التصديق الجذريّ"]
certificate_expiry["انتهاء أجل الشهادة"]
certificate_failure["عطل اتّصال ناجم عن الشهادة"]
thumbprint_hardcode["تثبيت البصمة في الشيفرة"]
group_policy["نهج المجموعة"]
intune["Microsoft Intune"]
currentuser_store["مخزن شهادات المستخدم"]
certmgr_msc["certmgr.msc"]
certlm_msc["certlm.msc"]
cert_drive["محرّك Cert:"]
pfx["ملفّ PFX"]
certutil["certutil"]
code_signing_cert["شهادة توقيع الشيفرة"]
trusted_publisher_store["مخزن الناشرين الموثوقين"]
desktop_app["تطبيق سطح مكتب لمستخدم تفاعليّ"]
cert_renewal["استبدال الشهادة"]
cert_ledger["سجلّ الشهادات"]
self_signed_cert["شهادة موقعة ذاتيّاً ارتجاليّة"]
trust_anchor_risk["خطر إساءة استخدام نقطة انطلاق الثقة"]
cert_selection["اختيار الشهادة (بحث)"]
personal_store["مخزن «شخصيّ» (My)"]
store_mismatch["الخلط بين المخازن"]
iis_apppool["مجمع تطبيقات IIS"]
task_scheduler["تشغيل غير مراقب عبر جدولة المهام"]
exportable_import["استيراد قابل للتصدير"]
key_exfiltration_risk["خطر إخراج المفتاح الخاصّ"]
everyone_full_control["منح Everyone تحكّماً كاملاً"]
partner_registration["التسجيل المسبق للشهادة لدى الطرف المقابل"]
cert_switchover["التبديل إلى الشهادة الجديدة"]
x509store["صنف X509Store"]
validonly_search["بحث شهادات بتعيين validOnly"]
key_usage["سمة استخدام المفتاح (Key Usage)"]
config_externalization["إخراج البصمة إلى التكوين"]
cert_choice_logging["إخراج الشهادة المختارة إلى السجلّ"]
windows_service -.->|"يستخدم"| localmachine_store
client_certificate -->|"يشترط"| private_key
windows_service -.->|"يشترط"| private_key_acl
certificate_chain -.->|"يشترط"| intermediate_ca
certificate_chain -->|"يشترط"| root_ca
certificate_expiry -.->|"قد يسبّب"| certificate_failure
thumbprint_hardcode -.->|"قد يسبّب"| certificate_failure
certificate_failure -.->|"يُتحقّق بـ"| certificate_chain
root_ca -.->|"يُكوَّن بـ"| group_policy
root_ca -.->|"يُكوَّن بـ"| intune
currentuser_store -->|"يُتحقّق بـ"| certmgr_msc
localmachine_store -->|"يُتحقّق بـ"| certlm_msc
certificate_store -->|"يُتحقّق بـ"| cert_drive
certificate_expiry -->|"يُتحقّق بـ"| cert_drive
private_key -.->|"يُحفظ في"| pfx
certificate_chain -->|"يُتحقّق بـ"| certutil
code_signing_cert -.->|"يُحفظ في"| trusted_publisher_store
desktop_app -.->|"يستخدم"| currentuser_store
root_ca -.->|"يُحفظ في"| localmachine_store
private_key_acl -.->|"يُكوَّن بـ"| certlm_msc
cert_renewal -.->|"يمنع"| certificate_failure
cert_ledger -.->|"يمنع"| certificate_expiry
self_signed_cert -.->|"قد يسبّب"| trust_anchor_risk
thumbprint_hardcode -->|"غير موصى به لـ"| cert_selection
self_signed_cert -->|"غير موصى به لـ"| root_ca
cert_ledger -->|"موصى به لـ"| certificate_expiry
currentuser_store -->|"يرث محتوى"| localmachine_store
client_certificate -->|"يُحفظ في"| personal_store
store_mismatch -->|"قد يسبّب"| certificate_failure
iis_apppool -.->|"يستخدم"| localmachine_store
iis_apppool -->|"يشترط"| private_key_acl
task_scheduler -.->|"يستخدم"| localmachine_store
exportable_import -->|"قد يسبّب"| key_exfiltration_risk
everyone_full_control -->|"غير موصى به لـ"| private_key_acl
cert_renewal -.->|"يشترط"| private_key_acl
partner_registration -.->|"ينبغي أن يسبق"| cert_switchover
x509store -->|"يستخدم"| certificate_store
validonly_search -.->|"يخفّف"| certificate_failure
client_certificate -.->|"يشترط"| key_usage
config_externalization -->|"موصى به لـ"| cert_selection
cert_choice_logging -->|"موصى به لـ"| certificate_failure
في المخطّط، يشير الخطّ المتّصل إلى علاقة قائمة دائماً، ويشير الخطّ المتقطّع إلى علاقة مشروطة (شروط قيامها مذكورة في شرح كلّ علاقة في الصفحة التفصيليّة). القائمة الكاملة للعلاقات (المجموع 41، مع الأدلّة ودرجة اليقين) وتعريفات المفاهيم الرئيسة مجمّعة في صفحة تفاصيل خريطة المعرفة (باليابانية). البيانات: JSON-LD / Turtle
2. الصورة الكلّيّة لمخزن الشهادات ── موضعان ومخازن منطقيّة
2.1. نظاما المستخدم والحاسوب
ينقسم مخزن شهادات Windows إلى «موضعين» كبيرين.1
- مخزن شهادات الحاسوب (الحاسوب المحلّيّ، LocalMachine): واحد لذلك الحاسوب، مشترك بين كلّ المستخدمين والخدمات على الحاسوب. جوهره تحت
HKEY_LOCAL_MACHINE\Software\Microsoft\SystemCertificatesفي السجلّ.2 - مخزن شهادات المستخدم (المستخدم الحاليّ، CurrentUser): منفصل لكلّ حساب مستخدم. جوهره تحت
HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates، أي جزء من ملفّ تعريف المستخدم.2
ثمّة أيضاً مخزن لكلّ حساب خدمة3، جوهره مفتاح سجلّ باسم الخدمة.2 ما ينبغي تثبيته أوّلاً عمليّاً هما الأوّلان.
مواصفة مهمّة واحدة. كلّ مخزن منطقيّ في مخزن المستخدم، باستثناء «شخصيّ»، يرث محتوى المخزن الذي يحمل الاسم نفسه في مخزن الحاسوب ويُظهره.1 مثلاً، إن وضعتم شهادة مرجع تصديق داخليّ في «مراجع التصديق الجذريّة الموثوقة» لمخزن الحاسوب، تظهر تلك الشهادة أيضاً في «مراجع التصديق الجذريّة الموثوقة» لكلّ مستخدم. بالمقابل، مخزن «شخصيّ» وحده لا يُورَث، لذا لشهادات العميل (= ما يُوضَع في المخزن الشخصيّ) عليكم أنتم أن تقرّروا «من يحتاج أن يراها». هذا اللاتناظر بطل المقال كلّه.
flowchart TB
accTitle: مخزن الحاسوب ومخزن المستخدم
accDescr: مخزن الحاسوب واحد للحاسوب ومشترك لكلّ المستخدمين والخدمات، ومخزن المستخدم منفصل لكلّ حساب ويرث غير الشخصيّ من جانب الحاسوب ويظهره
subgraph LM["الحاسوب (LocalMachine)<br/>واحد للحاسوب · مشترك لكلّ المستخدمين والخدمات"]
LMMY["شخصيّ (My)"]
LMROOT["مراجع التصديق الجذريّة الموثوقة (Root)"]
LMCA["مراجع التصديق الوسيطة (CA)"]
LMTP["الناشرون الموثوقون (TrustedPublisher)"]
end
subgraph CU["المستخدم (CurrentUser)<br/>منفصل لكلّ حساب"]
CUMY["شخصيّ (My)<br/>※ لا يُورَث = تقرّرون أنتم أين تضعون"]
CUROOT["مراجع التصديق الجذريّة الموثوقة (Root)"]
CUCA["مراجع التصديق الوسيطة (CA)"]
CUTP["الناشرون الموثوقون (TrustedPublisher)"]
end
LMROOT -.->|"يُرى بوروث المحتوى"| CUROOT
LMCA -.->|"يُورَث"| CUCA
LMTP -.->|"يُورَث"| CUTP
الشكل 1: مخزن المستخدم يرث محتوى مخزن الحاسوب باستثناء «شخصيّ»؛ فعليكم أنتم تقرير أين تضعون شهادات العميل.
2.2. المخازن المنطقيّة الرئيسة
داخل كلّ موضع تنقسم المحتويات إلى مخازن منطقيّة حسب الدور. المجلّدات التي ترونها في certmgr.msc / certlm.msc هي ذلك، وعند النظر من PowerShell أو سطر الأوامر تُستخدم الأسماء الداخليّة بالإنكليزيّة.24
| اسم العرض | الاسم الداخليّ | ما يُوضَع فيه |
|---|---|---|
| شخصيّ | My | شهادات يستخدمها هذا الحاسوب / هذا المستخدم. شهادات العميل والخادم هنا. ما يرتبط بالمفتاح الخاصّ أيضاً هنا |
| مراجع التصديق الجذريّة الموثوقة | Root | شهادات مرجع التصديق الجذريّ التي تكون نقطة انطلاق الثقة. ما تحت مرجع التصديق الموضوع هنا «يُوثَق» |
| مراجع التصديق الوسيطة | CA | شهادات مرجع التصديق الوسيط التي تصل الجذر بالنهاية. مادّة بناء السلسلة |
| الناشرون الموثوقون | TrustedPublisher | شهادات تُوثَق كناشر لبرمجيّات موقَّعة (الفصل 8) |
2.3. ثلاث نوافذ اطّلاع ── certmgr.msc / certlm.msc / محرّك Cert:
ثمّة ثلاث وسائل للنظر إلى المخزن نفسه.34
- certmgr.msc: وحدة إدارة تفتح مخزن المستخدم الحاليّ.
- certlm.msc: وحدة إدارة تفتح مخزن الحاسوب المحلّيّ.
- محرّك
Cert:في PowerShell: يمكن تشغيل المخزن كملفّ نظام بتراتبيةCert:\CurrentUser\...وCert:\LocalMachine\.... تُعرَّف الشهادات ببصمة الإبهام.
لاحظوا أنّه عند إضافة ميزة الشهادات يدوياً إلى mmc.exe تختارون الهدف من ثلاثة أنواع: «حساب مستخدم» و«حساب حاسوب» و«حساب خدمة». مستخدم غير مدير يدير مخزن حساب مستخدمه فقط.3
أوّل خطوة في التحقيق في مشكلة هي محاذاة «أيّ مخزن ينظر إليه التطبيق» مع «أيّ مخزن تنظرون إليه أنتم». التحقيق في عطل خدمة وأنتم تتأمّلون certmgr.msc لا يعطي جواباً أبداً لأنّ موضع النظر مختلف.
3. أين تضعونها ── جدول قرار يُحسَم بشكل تشغيل البرنامج
معيار الحكم واحد. تحت حساب من يعمل البرنامج الذي يستخدم تلك الشهادة.
| شكل التشغيل | حساب التشغيل | المخزن الذي تضعون فيه | ملاحظة |
|---|---|---|---|
| تطبيق سطح مكتب يشغّله مستخدم تفاعليّ | المستخدم المسجَّل دخوله نفسه | المستخدم (Cert:\CurrentUser\My) | يلزم النشر لكلّ حساب يستخدم. إن استخدمه عدّة أشخاص على حاسوب مشترك فانظروا أيضاً في مخزن الحاسوب |
| خدمة Windows | LocalSystem / NETWORK SERVICE / حساب خدمة مخصَّص | الحاسوب (Cert:\LocalMachine\My) | غير LocalSystem (NETWORK SERVICE وحساب مخصَّص وغيرها) يلزم منح إذن قراءة المفتاح الخاصّ (الفصل 4). LocalSystem يقرأ بامتياز SYSTEM الافتراضيّ |
| تطبيق ويب على IIS | هويّة مجمع التطبيقات | الحاسوب | كما أعلاه |
| تشغيل دون مراقبة في جدولة المهام (تشغيل بغضّ النظر عن تسجيل دخول المستخدم) | الحساب المحدَّد للمهمّة | مخزن الحاسوب موصى به | يمكن تشغيله بمخزن مستخدم حساب التشغيل أيضاً، لكنّه يزيد تحقّقاً من ظهور الملفّ التعريفيّ والمخزن بلا فائدة تُذكَر |
| تقديم إلكترونيّ / مصادقة ويب في المتصفّح | المستخدم المسجَّل دخوله نفسه | المستخدم | طبيعيّ أيضاً بمعنى عدم إتاحة الاستخدام لغير من وُزِّع عليه |
إن التبست، ما يعمل دون مراقبة مخزن الحاسوب، وما يشغّله إنسان مخزن المستخدم.
3.1. تشريح الحادث الكلاسيكيّ ── «عمل أثناء التطوير لكن لا يُعثَر عليه بعد أن صار خدمة»
يمكن إعادة إنتاج هذا الحادث بدقّة بالإجراء التالي.
- ينقر المطوّر نقراً مزدوجاً على pfx على حاسوبه ليستورد. افتراضيّ المعالج «المستخدم الحاليّ»، فتدخل الشهادة مخزن مستخدم حساب المطوّر.
- تطبيق أثناء التطوير يعمل من Visual Studio، أي بحساب المطوّر، فيُعثَر على الشهادة بفتح
StoreLocation.CurrentUser. يعمل. - يُسجَّل كخدمة Windows على خادم الإنتاج. تعمل الخدمة تحت NETWORK SERVICE أو حساب مخصَّص.
CurrentUserالذي تفتحه شيفرة الخدمة هو مخزن مستخدم حساب تشغيل الخدمة. هناك فارغ. «الشهادة غير موجودة».
flowchart TB
accTitle: عمل أثناء التطوير لكن لا يُعثَر عليه بعد أن صار خدمة
accDescr: شهادة وُضعت في مخزن مستخدم المطوّر غير مرئيّة من CurrentUser لخدمة تعمل تحت حساب آخر
subgraph DEV["آلة التطوير"]
D1["استيراد بنقر مزدوج على pfx<br/>افتراضيّ المعالج «المستخدم الحاليّ»"] --> D2["يدخل مخزن مستخدم<br/>حساب المطوّر"]
D2 --> D3["التشغيل من Visual Studio<br/>= يعمل بحساب المطوّر"]
D3 --> D4["يفتح CurrentUser فيُعثَر عليه<br/>→ يعمل"]
end
subgraph PROD["خادم الإنتاج"]
P1["التسجيل كخدمة Windows<br/>حساب التشغيل NETWORK SERVICE أو نحوه"] --> P2["CurrentUser الذي تفتحه الشيفرة هو<br/>مخزن مستخدم حساب الخدمة"]
P2 --> P3["هناك فارغ<br/>→ «الشهادة غير موجودة»"]
end
D4 -.->|"وضع البرنامج نفسه"| P1
الشكل 2: مخزن مستخدم المطوّر ومخزن مستخدم حساب الخدمة مختلفان؛ والعمل أثناء التطوير لا يضمن العثور في الإنتاج.
النقطة أنّ مخزن المستخدم «يوجد بعدد الحسابات». حتّى إن فتح مدير certmgr.msc وقال «هو داخل كما ينبغي؟»، فذلك مخزن المدير نفسه لا مخزن حساب الخدمة. العلاج ليس نسخاً ارتجاليّاً، بل إعادة الوضع في مخزن الحاسوب ومحاذاة الشيفرة أيضاً مع StoreLocation.LocalMachine. ومنح الأذون في الفصل التالي مجموعة واحدة مع ذلك.
4. المفتاح الخاصّ وأذون الوصول ── الحادث الكلاسيكيّ الثاني
4.1. الشهادة والمفتاح الخاصّ شيئان مختلفان
ما يظهر في قائمة مخزن الشهادات هو الشهادة (معلومات عامّة)، لا المفتاح الخاصّ نفسه. ما يلزم فعلاً لمصادقة العميل معالجة توقيع بالمفتاح الخاصّ، لذا «الظهور في القائمة» و«القدرة على الاستخدام» مشكلتان منفصلتان. الخلط هنا ينتج أعطالاً صعبة الرؤية مثل «الشهادة موجودة لكن مصافحة TLS تفشل» أو «خطأ داخليّ من عائلة Access Denied».
4.2. استيراد pfx عمليّاً ── قابليّة التصدير قرار
زوج الشهادة والمفتاح الخاصّ يُسلَّم كملفّ pfx (PKCS #12)، ويُجلَب إلى المخزن بـ Import-PfxCertificate.6
$pwd = Get-Credential -UserName '(أدخلوا كلمة المرور أدناه)' -Message 'كلمة مرور PFX'
Import-PfxCertificate -FilePath C:\certs\client.pfx `
-CertStoreLocation Cert:\LocalMachine\My -Password $pwd.Password
المهمّ هنا السلوك الافتراضيّ أنّ المفتاح الخاصّ المُجلَب لا يمكن إعادة تصديره ما لم تُرفَق -Exportable.6 إدخال كلّ شيء قابلاً للتصدير «لكي يمكن الترحيل لاحقاً» فعل يزيد مسار إخراج المفتاح الخاصّ بمسار واحد. اجعلوا التشغيل حفظ أصل pfx بأمان، والمفتاح الخاصّ على المخزن غير قابل للتصدير كأساس — هذه توصيتنا. لاحظوا أنّ حفظ أصل pfx وكلمة مروره هو ما يُترَك غالباً نصّاً صريحاً. الفكرة مرتَّبة في «أفضل الممارسات في DPAPI لإبعاد الأسرار عن إعدادات النصّ الصريح في تطبيقات Windows» و«التعامل الآمن مع الاعتمادات في PowerShell».
4.3. منح أذون المفتاح الخاصّ لحساب الخدمة
المفتاح الخاصّ لشهادة وُضعت في مخزن الحاسوب عادةً تكوين لا يُقرأ فيه إلا من المديرين وSYSTEM افتراضيّاً. لذا تقرأ خدمة تعمل بـ LocalSystem المفتاح الخاصّ كما هي، لكن عند التشغيل بحساب غير ذلك مثل NETWORK SERVICE أو حساب خدمة مخصَّص أو هويّة مجمع تطبيقات IIS تمنحون حساب التشغيل إذن قراءة صراحة. يمكن تنفيذ الإجراء من واجهة ميزة الشهادات.5
- افتحوا certlm.msc (أو ميزة الشهادات المستهدفة لحساب الحاسوب).
- انقروا بالزرّ الأيمن الشهادة المستهدفة في «شخصيّ» → «شهادات»، وافتحوا «إدارة المفاتيح الخاصّة» من «كلّ المهام».
- في علامة التبويب «أمن» أضيفوا حساب التشغيل (NETWORK SERVICE، حساب خدمة مخصَّص، هويّة مجمع تطبيقات IIS، إلخ) واسمحوا بـ «قراءة».5
التحكّم الكامل غير لازم. للقراءة تكفي للقراءة إن كان الاستخدام للتوقيع فقط. بالمقابل، منح Everyone تحكّماً كاملاً لأنّه «لا يعمل» فعل يُنزل المفتاح الخاصّ إلى معاملة كلمة مرور صريحة، فتجنّبوه قطعاً. وضع مخزن الحاسوب ومنح أذون المفتاح الخاصّ دائماً مجموعة واحدة — كتابة هذا في الكتيّب وحده تُزيل حوادث هذه السلالة.
5. منع حوادث انتهاء الأجل ── الجرد والاستبدال والسجلّ
5.1. الجرد بـ PowerShell
أجل الشهادة في خاصّيّة NotAfter. يمكن الجرد آليّاً بـ Get-ChildItem على محرّك Cert:.4
# سرد «شخصيّ» مخزن الحاسوب بترتيب الأجل
Get-ChildItem Cert:\LocalMachine\My |
Sort-Object NotAfter |
Format-Table Thumbprint, Subject, NotAfter
# استخراج ما ينتهي خلال 60 يوماً فقط (0 يعيد ما انتهى أصلاً)
Get-ChildItem -Path Cert:\LocalMachine\My -ExpiringInDays 60
-ExpiringInDays معامل يعيد «شهادات تنتهي خلال العدد المحدَّد من الأيّام»، و0 يخرج شهادات انتهت أصلاً.4 اجعلوا هذا مهمّة مجدولة شهريّة تدور على كلّ الخوادم، واجمعوا النتائج في بريد أو سجلّ — ذلك وحده يكاد يمنع حوادث «من صباح الاثنين التحقّق من الأهليّة لا يمرّ لانتهاء الأجل».
5.2. إجراء الاستبدال ── فترة توازٍ القديم والجديد وفخّ البصمة
تحديث الشهادة ليس «احذفوا ثمّ ضعوا» بل «أضيفوا ثمّ بدّلوا، وأكّدوا ثمّ احذفوا».
- استوردوا الشهادة الجديدة (pfx) إلى المخزن نفسه. البصمة مختلفة، فيمكن للقديم والجديد التعايش في المخزن نفسه.
- امنحوا أذون المفتاح الخاصّ للشهادة الجديدة (الفصل 4). هذا أكثر ما يُنسى عند التحديث. الأذون تلحق بكلّ مفتاح خاصّ للشهادة، فبعد استبدال الشهادة يُعاد المنح أيضاً.
- أنجزوا الإبلاغ إلى نظام الطرف المقابل (لواجهات برمجة تحتاج تسجيلاً مسبقاً للشهادة) مع مواصلة التشغيل بالشهادة القديمة أوّلاً، واضمنوا فترة توازٍ يُقبل فيها الاثنان. إن قدّمتم التبديل، يرفض الطرف المقابل الشهادة الجديدة فيتوقّف اتّصال الإنتاج.
- بدّلوا تكوين التطبيق إلى الشهادة الجديدة، وأكّدوا التشغيل.
- بعد فترة كافية، احذفوا الشهادة القديمة.
flowchart LR
accTitle: تحديث الشهادة إضافة ثمّ تبديل
accDescr: تضعون pfx الجديد في المخزن نفسه وتمنحون الأذون وتسجّلون مسبقاً لدى الطرف المقابل ثم تبدّلون البصمة، وبعد فترة التوازي تحذفون الشهادة القديمة
I["1. استيراد pfx الجديد إلى<br/>المخزن نفسه (تعايش قديم وجديد)"] --> P["2. منح أذون المفتاح الخاصّ<br/>للشهادة الجديدة"]
P --> R["3. تسجيل مسبق لدى الطرف المقابل<br/>(مواصلة التشغيل بالشهادة القديمة)"]
R --> SW["4. إعادة كتابة بصمة التكوين<br/>والتبديل وتأكيد التشغيل"]
SW --> DEL["5. بعد فترة التوازي<br/>حذف الشهادة القديمة"]
الشكل 3: ترتيب استبدال الشهادة إضافة → أذون → تسجيل مسبق → تبديل التكوين → حذف القديمة؛ ولا تنسوا تحديث البصمة.
أكبر فخّ عندئذٍ بصمة إبهام مكتوبة في ملفّ تكوين أو شيفرة. البصمة فريدة لكلّ شهادة، فتتغيّر حتماً بالتحديث. إن بقي موضع واحد يشير إلى البصمة القديمة، يحدث «حدّثنا الشهادة لكن لا يتّصل». الموثوق إدارة أين كُتبت البصمة (تكوين التطبيق، ربط IIS، سكربت، إبلاغ الطرف المقابل) في سجلّ.
5.3. توصية بسجلّ شهادات
السجلّ يكفي فيه أوّلاً ورقة Excel واحدة. كحدّ أدنى اصنعوا أعمدة الغرض / المُصدِر / الموضوع / البصمة / الموضع (اسم الخادم + المخزن) / الحسابات التي تملك أذون المفتاح الخاصّ / الأجل / رابط إجراء التحديث / المسؤول، وقاطعوا بنتائج جرد 5.1. واقع حوادث الشهادات ليس مشكلة تقنيّة بل مشكلة «لا أحد يملك قائمة»، فالسجلّ هو الأكثر فاعليّة.
6. قراءة التحقّق والفشل ── السلسلة وتوزيع الجذر
6.1. أساسيّات تحقّق السلسلة وcertutil
أخطاء عائلة «هذه الشهادة غير موثوقة» حالة انقطاع السلسلة (مسار الإثبات) من شهادة النهاية إلى مرجع التصديق الجذريّ في موضع ما. للعزل certutil ملائم.7
flowchart TB
accTitle: ثلاثة أسباب كلاسيكيّة لانقطاع تحقّق السلسلة
accDescr: يتعذّر الحصول على مرجع التصديق الوسيط، أو الجذر غير موزَّع، أو النهاية منتهية الأجل، فينتج خطأ ثقة بأحد هذه
LEAF["شهادة النهاية<br/>(شهادة عميل أو شهادة خادم)"] --> INT["شهادة مرجع التصديق الوسيط<br/>موضعها: مخزن مراجع التصديق الوسيطة (CA)"]
INT --> ROOT["شهادة مرجع التصديق الجذريّ<br/>موضعها: مراجع التصديق الجذريّة الموثوقة (Root)"]
INT -.->|"يتعذّر الحصول عليها<br/>(عرض أو AIA أو مخزن، أيّ منها)"| E1["لا يمكن بناء السلسلة<br/>(السبب الكلاسيكيّ 1)"]
ROOT -.->|"غير موزَّعة"| E2["خطأ «غير موثوقة»<br/>(السبب الكلاسيكيّ 2)"]
LEAF -.->|"انتهى الأجل"| E3["خطأ فترة الصلاحيّة<br/>(السبب الكلاسيكيّ 3)"]
الشكل 4: تنقطع السلسلة إن تعذّر مرجع التصديق الوسيط أو الجذر، أو بانتهاء الأجل؛ حدّدوا الطبقة بـ certutil.
:: بناء سلسلة ملفّ الشهادة والتحقّق منها (مع جلب عناوين تأكيد الإلغاء)
certutil -urlfetch -verify client.cer
:: إن استخدم التطبيق المستهدف مخزن المستخدم فأضيفوا -user للتحقّق في السياق نفسه
certutil -user -urlfetch -verify client.cer
:: تفريغ محتوى المخزن (بإضافة -user يصير مخزن المستخدم)
certutil -store My
certutil -user -store My
ينفّذ certutil -verify تحقّق الشهادة وCRL والسلسلة، ويبني سلسلة كاملة ويتحقّق منها إن لم تحدّدوا CACertFile.7 الإخراج طويل، لكن تُقرأ عنده أيّ طبقة انقطعت عندها الثقة، وما إذا أُخذت معلومات الإلغاء. الأسباب النموذجيّة ثلاثة: (1) تعذّر الحصول على شهادة مرجع التصديق الوسيط (الطرف في TLS لم يرسلها، ولم تُجلَب من معلومات AIA للشهادة، وليست في مخزن «مراجع التصديق الوسيطة»)، (2) جذر مرجع التصديق الداخليّ غير موزَّع إلى «مراجع التصديق الجذريّة الموثوقة»، (3) انتهاء أجل الشهادة نفسها. يُحَلّ مرجع التصديق الوسيط أيضاً بعرض الطرف المقابل أو الجلب التلقائيّ عبر AIA، فاعتبروا الوضع في المخزن «إحدى وسائل الضمان».
6.2. توزيع جذر مرجع تصديق داخليّ أو موقع ذاتيّاً بـ GPO/Intune
عند استخدام مرجع تصديق داخليّ أو شهادة موقعة ذاتيّاً للتحقّق، يلزم توزيع شهادة الجذر تلك إلى كلّ حاسوب. لا تضعوها يدوياً جهازاً بجهاز، بل اركبوا على آليّة التوزيع.
- بيئة Active Directory (GPO): استيراد الشهادة إلى «مراجع التصديق الجذريّة الموثوقة» تحت
تكوين الحاسوب\السياسات\إعدادات Windows\إعدادات الأمن\سياسات المفتاح العامّفي نهج المجموعة يوزّعها إلى الحواسيب المستهدفة.8 - بيئة إدارة Intune: توزّعون شهادات مرجع التصديق الجذريّ / الوسيط بملفّ شخصيّ «شهادات موثوقة». على Windows يمكن اختيار مخزن الوجهة (جذر / وسيط الحاسوب، وسيط المستخدم).9
كما في 2.1، الوضع في جذر مخزن الحاسوب يُوثَق من كلّ المستخدمين.1 ولهذا بالضبط واجهوا الخطر المعكوس أيضاً. تشغيل وضع شهادة موقعة ذاتيّاً في «مراجع التصديق الجذريّة الموثوقة» فعل يزرع نقطة انطلاق ثقة جديدة في ذلك الحاسوب. إن تسرّب مفتاحها الخاصّ، يصير أساساً لإصدار شهادات تنتحل أيّ موقع أو برمجيّة. للتشغيل الدائم، المسار إقامة مرجع تصديق داخليّ يحمي المفتاح الخاصّ كما ينبغي، أو الاقتراب من شهادة مرجع تصديق عامّ؛ وجذر موقع ذاتيّاً مبدأه «مقصور على بيئة التحقّق وبأجل مضروب».
7. منظور المطوّر ── استخدام المخزن صحيحاً من .NET
7.1. البحث بالبصمة بـ X509Store
من .NET تفتحون المخزن بـ X509Store وتجلبون الشهادة بـ Find.1011
using System.Security.Cryptography.X509Certificates;
static X509Certificate2 GetClientCertificate(string thumbprint)
{
using var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
var found = store.Certificates.Find(
X509FindType.FindByThumbprint, thumbprint, validOnly: true);
if (found.Count == 0)
throw new InvalidOperationException(
$"الشهادة غير موجودة: البصمة={thumbprint}, " +
$"الموضع={store.Location}\\{store.Name}");
var cert = found[0];
if (!cert.HasPrivateKey)
throw new InvalidOperationException(
$"الشهادة موجودة لكن المفتاح الخاصّ غير مرتبط (استيراد " +
$"من .cer مثلاً): البصمة={thumbprint}, الموضع={store.Location}\\{store.Name}");
return cert;
}
حكم الفصل 3 يتّصل مباشرة هنا. شيفرة تعمل كخدمة فـ StoreLocation.LocalMachine، وتطبيق تفاعليّ فـ StoreLocation.CurrentUser. انتبهوا أيضاً إلى المعامل الثالث لـ Find وهو validOnly. true يعيد شهادات صالحة اجتازت التحقّق فقط.11 يصير تأميناً ضدّ الإمساك بشهادة منتهية، لكن شهادة موقعة ذاتيّاً للاختبار سلسلتها غير موثوقة تسقط أيضاً في جانب «غير موجودة»، لذا عندما «داخلة لكن لا تُوجَد» اشتبهوا هنا أيضاً. كذلك، ضعوا حتماً في رسالة الخطأ عند عدم الوجود أيّ مخزن بُحث فيه كما في المثال أعلاه. زمن التحقيق في حادث الفصل 3 يتغيّر بمرتبة.
7.2. تحميل شهادة عميل على HttpClient
تُضاف الشهادة المجلوبة إلى HttpClientHandler.ClientCertificates لتُعرَض على الخادم. هذه المجموعة مجموعة الشهادات المعروضة على الخادم في مصادقة العميل القائمة على الشهادة.12
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(GetClientCertificate(thumbprint));
var client = new HttpClient(handler);
// بعد ذلك يُستخدم كـ HttpClient عاديّ
لاحظوا أنّه في عائلة .NET Core، إن وُجدت سمة استخدام المفتاح (Key Usage) في الشهادة، مذكور في الوثائق أنّها لا تُستخدم لإرسال الطلب ما لم تتضمّن «Digital Signature».12 إن صرتم في موقف طلب إصدار شهادة عميل، انقلوا الغرض (مصادقة عميل) صحيحاً. كذلك، HttpClient يسبّب نفاد مقابس ومشاكل تتبّع DNS إن أُخطئ نمط إنشائه. تصميم إطالة عمر المعالج مع المجموعة كما عولج في «لا تُحِط HttpClient بـ using».
7.3. مشكلة موت البصمة المثبَّتة عند الاستبدال
البحث بالبصمة موثوق، لكن دفن البصمة في الشيفرة يتطلّب بناء وإصداراً عند كلّ تحديث شهادة. العلاج في التصميم ثلاث مراحل.
- الحدّ الأدنى: أخرجوا البصمة إلى ملفّ تكوين (appsettings ونحوه) بحيث يمكن الاستبدال بلا إصدار. سجّلوا مواضع التكوين في سجلّ 5.3.
- خطوة أبعد: ابحثوا باسم الموضوع أو المُصدِر، واجمعوا مع
validOnly: trueلاختيار «ما هو صالح حالياً بذلك الاسم وأبعدNotAfter». ينتقل تلقائيّاً إلى الشهادة الجديدة في فترة توازٍ القديم والجديد. غير أنّ ثمّة خطر إمساك شهادة غير مقصودة بالاسم نفسه، فاجعلوا تأكيد المُصدِر وإخراج السجلّ مجموعة. كذلك، لا ينعقد هذا الانتقال التلقائيّ إلا عندما لا يحتاج الطرف المقابل تسجيلاً مسبقاً للشهادة. لواجهات برمجة تحتاج تسجيلاً مسبقاً (5.2)، قد ينتقل وحده إلى شهادة مستوردة غير مسجَّلة فيتوقّف الاتّصال، فالتزموا أسلوب إخراج التكوين الذي يبدّل بعد تأكيد اكتمال التسجيل. - الإغلاق بالتشغيل: بأيّ أسلوب، أبقوا في السجلّ عند البدء «أيّ شهادة (بصمة وأجل) اختيرت». هذا السطر واحد يفعل في التحقيق في الأعطال وفي مقابلة السجلّ.
8. العلاقة بشهادات توقيع الشيفرة ── مخزن «الناشرون الموثوقون»
ما عولج حتّى هنا شهادات للاتّصال (TLS)، لكن مخزن الشهادات يضمّ عالماً آخر يتعايش معه — توقيع الشيفرة. مخزن «الناشرون الموثوقون (TrustedPublisher)» الذي ظهر في جدول 2.2 نقطة الاتّصال تلك، وهو موضع تسجيل شهادة ناشر برمجيّة موقَّعة كموثوق. يوجد في موضعي المستخدم والحاسوب كليهما10، ويُستخدم في تشغيل مثل توزيع ناشر تطبيق توزيع داخليّ إلى TrustedPublisher لكلّ حاسوب بـ GPO.
لمن يحتاج التعامل مع توقيع الشيفرة أو تحذير SmartScreen («قامت Windows بحماية جهاز الكمبيوتر الخاص بك») كـ«طرف التوزيع»، لخّصنا ذلك في مقال منفصل «لماذا تظهر رسالة «قامت Windows بحماية جهاز الكمبيوتر الخاص بك» في Windows». معرفة هذا المقال (نظاما المخزن، توزيع الجذر) تُستخدم كما هي كمعرفة مقدّمة.
9. الخلاصة
- مخزن الشهادات نظامان: المستخدم (CurrentUser) والحاسوب (LocalMachine). certmgr.msc / certlm.msc / محرّك
Cert:ثلاث نوافذ تنظر إلى الشيء نفسه. أوّل خطوة في التحقيق محاذاة «عن أيّ مخزن نتحدّث». - موضع الوضع يُحسَم بـ«من يعمل البرنامج بوصفه». التنفيذ دون مراقبة (خدمة وIIS ومهمّة) مخزن الحاسوب، والتطبيق التفاعليّ مخزن المستخدم كقاعدة.
- «عمل أثناء التطوير لكن لا يُعثَر عليه في الإنتاج» سببه أنّ مخزن مستخدم المطوّر ومخزن مستخدم حساب الخدمة شيئان مختلفان. يُحَلّ بمحاذاة مخزن الحاسوب +
StoreLocation.LocalMachine. - وضع مخزن الحاسوب ومنح إذن القراءة في «إدارة المفاتيح الخاصّة» مجموعة واحدة. لا تنسوا إعادة المنح عند التحديث أيضاً.
- استيراد pfx غير قابل للتصدير افتراضيّاً.
-Exportableفقط عندما تلزم حقّاً. أدرجوا حفظ أصل pfx وكلمة المرور في التصميم أيضاً. - انتهاء الأجل يُمنَع بجرد دوريّ لـ
Get-ChildItem Cert: ... -ExpiringInDaysوسجلّ شهادات. الاستبدال بالترتيب «إضافة → تبديل → تأكيد → حذف»، وانتبهوا إلى إغفال تحديث البصمة في التكوين. - عزل السلسلة بـ
certutil -urlfetch -verify. وزّعوا جذر مرجع التصديق الداخليّ بـ GPO/Intune، وتشغيل وضع موقع ذاتيّاً في الجذر مقصور على بيئة التحقّق وبأجل. - في الشيفرة أخرجوا البصمة إلى التكوين، واتركوا الشهادة المختارة في السجلّ. ذلك وحده يغيّر التعامل مع الأعطال الناجمة عن الشهادات تغييراً بيّناً.
مقالات ذات صلة
- لماذا تظهر رسالة «قامت Windows بحماية جهاز الكمبيوتر الخاص بك» في Windows
- أفضل الممارسات في DPAPI لإبعاد الأسرار عن إعدادات النصّ الصريح في تطبيقات Windows
- التعامل الآمن مع الاعتمادات في PowerShell ── طرد كلمات المرور الصريحة من السكربتات
- لا تُحِط HttpClient بـ using ── الممارسة العمليّة للاتّصال عبر HTTP في تطبيقات C# للأعمال
- ماذا يحدث عند تمرير بطاقة التأمين الصحّي «ماينا» ── قراءة التحقّق من الأهليّة عبر الإنترنت وربط نظام الوصفات من شيفرة ORCA
مجالات الاستشارة ذات الصلة
تتعامل شركة كومورا سوفت ذ.م.م. مع تطوير تطبيقات أعمال تدمج تكامل واجهة برمجة ويب بشهادة عميل (واجهات برمجة بنوك، التحقّق من الأهليّة عبر الإنترنت، إلخ)، والتحقيق في أعطال من نوع «الشهادة غير موجودة» و«بعد التحديث لا يتّصل»، وترتيب إجراءات استبدال الشهادات. يصحّ الاستشارة من مرحلة «لا نعرف أيّ مخزن ننظر إليه».
- تطوير تطبيقات ويندوز
- التحقيق في الأخطاء وتحليل السبب الجذري
- الاستشارات التقنيّة ومراجعة التصميم
- التواصل معنا
روابط مرجعيّة
-
Microsoft Learn, Local Machine and Current User Certificate Stores. حول كون مخزن شهادات الحاسوب محلّيّاً للحاسوب ومشتركاً لكلّ المستخدمين وتحت HKEY_LOCAL_MACHINE، وكون مخزن شهادات المستخدم لكلّ حساب مستخدم وتحت HKEY_CURRENT_USER، ووراثة مخزن المستخدم لمحتوى مخزن الحاسوب باستثناء مخزن «شخصيّ» (ظهور شهادة أُضيفت إلى «مراجع التصديق الجذريّة الموثوقة» للحاسوب في المخزن نفسه لكلّ مستخدم). ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, System Store Locations. حول مواضع السجلّ لـ CERT_SYSTEM_STORE_CURRENT_USER / CERT_SYSTEM_STORE_LOCAL_MACHINE (Software\Microsoft\SystemCertificates تحت HKEY_CURRENT_USER / HKEY_LOCAL_MACHINE على التوالي)، وكون المخازن المنطقيّة المعرَّفة MY وRoot وTrust وCA، ووجود مخزن للخدمة في مفتاح سجلّ لكلّ اسم خدمة (Software\Microsoft\Cryptography\Services\ServiceName\SystemCertificates)، ووجود مخزن منفصل لتوزيع نهج المجموعة. ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, How to: View certificates with the MMC snap-in. حول كون certlm.msc أداة تدير شهادات الجهاز المحلّيّ (الحاسوب المحلّيّ) وcertmgr.msc شهادات المستخدم الحاليّ، وكون أهداف ميزة الشهادات ثلاثة أنواع «حساب حاسوب» و«حساب مستخدم» و«حساب خدمة»، وأنّ مستخدماً غير مدير يدير شهادات حساب مستخدمه فقط. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, about_Certificate_Provider. حول كون محرّك Cert: في PowerShell فضاء أسماء تراتبيّاً بموضعي مخزن CurrentUser وLocalMachine، وإمكان تعداد المخازن والشهادات بـ Get-ChildItem، وعودة معامل -ExpiringInDays لشهادات تنتهي خلال العدد المحدَّد من الأيّام (0 لما انتهى أصلاً)، والمعاملات الديناميكيّة مثل -CodeSigningCert، وتخزين الأجل في خاصّيّة NotAfter، وتعريف الشهادات ببصمة الإبهام. ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Microsoft Learn, How to Modify Private Key Permissions to Support Management Server or Streaming Server. حول إجراء فتح «إدارة المفاتيح الخاصّة» (Manage Private Keys) في ميزة الشهادات المستهدفة لمخزن شهادات الحاسوب المحلّيّ، وإضافة إذن وصول «قراءة» لحساب تشغيل الخدمة (مثال: Network Service) في علامة التبويب «أمن». ↩ ↩2 ↩3
-
Microsoft Learn, Import-PfxCertificate. حول جلب Import-PfxCertificate الشهادة والمفتاح الخاصّ من ملفّ PFX إلى المخزن المحدَّد، وتعذّر تصدير المفتاح الخاصّ المُجلَب إن لم يُحدَّد مفتاح -Exportable، وصيغة معاملات -CertStoreLocation و-Password و-FilePath وأمثلة الاستخدام. ↩ ↩2 ↩3
-
Microsoft Learn, certutil. حول تحقّق certutil -verify من الشهادة وCRL وسلسلة الشهادات وبنائه سلسلة كاملة والتحقّق منها إن لم يُحدَّد ملفّ شهادة مرجع التصديق، وإتاحة خيار -urlfetch، وتفريغ مخزن الشهادات بـ certutil -store والوصول إلى مخزن المستخدم بدل مخزن الحاسوب بخيار -user. ↩ ↩2
-
Microsoft Learn, Distribute Certificates to Client Computers by Using Group Policy. حول إجراء استيراد شهادة إلى «مراجع التصديق الجذريّة الموثوقة» تحت «تكوين الحاسوب\السياسات\إعدادات Windows\إعدادات الأمن\سياسات المفتاح العامّ» في نهج المجموعة لتوزيعها إلى حواسيب العملاء في النطاق، والأذون اللازمة (مكافئ Domain Admins / Enterprise Admins). ↩
-
Microsoft Learn, Create trusted certificate profiles in Microsoft Intune. حول كون ملفّ شخصيّ «شهادات موثوقة» في Intune آليّة لتوزيع شهادات مرجع تصديق جذريّ أو وسيط إلى الأجهزة المُدارة، واستخدامه لتأسيس الثقة بمرجع التصديق الجذريّ كمقدّمة لملفّات شخصيّة شهادات SCEP/PKCS، وإمكان اختيار مخزن الوجهة على Windows كـ«مخزن شهادات الحاسوب - جذر» و«مخزن شهادات الحاسوب - وسيط» و«مخزن شهادات المستخدم - وسيط». ↩
-
Microsoft Learn, X509Store Class. حول إمكان بناء X509Store بتعيين StoreName وStoreLocation (CurrentUser / LocalMachine)، وفتح المخزن بطريقة Open وOpenFlags (ReadOnly وOpenExistingOnly وغيرها)، وجلب مجموعة الشهادات بخاصّيّة Certificates، وتضمّن أسماء المخازن القياسيّة My وRoot وCA وTrustedPublisher وغيرها، ووجود مخزن TrustedPublisher في CurrentUser وLocalMachine كليهما. ↩ ↩2
-
Microsoft Learn, X509Certificate2Collection.Find(X509FindType, Object, Boolean) Method. حول بحث طريقة Find عن شهادات بـ X509FindType (FindByThumbprint وغيرها) وقيمة البحث، وعودة الشهادات الصالحة التي اجتازت التحقّق فقط عند تعيين المعامل الثالث validOnly إلى true. ↩ ↩2
-
Microsoft Learn, HttpClientHandler.ClientCertificates Property. حول كون خاصّيّة ClientCertificates مجموعة X509CertificateCollection تُعرَض على الخادم في مصادقة العميل القائمة على الشهادة، ولزوم تضمين «Digital Signature» في .NET Core إن وُجدت سمة استخدام المفتاح في الشهادة. ↩ ↩2
مقالات ذات صلة
أحدث المقالات التي تشترك في نفس الوسوم. عمّق فهمك بمواضيع مرتبطة.
جدار حماية Windows وتطبيقات الأعمال ── سجِّلوا القواعد الواردة من المثبِّت
«يعمل على آلة التطوير لكنّ العميل لا يتّصل» سببه الكلاسيكيّ جدار حماية Windows. يشرح المقال السلوك الافتراضيّ لحظر الوارد والملفّات الشخص...
دليل Windows LAPS العمليّ ── التخلّي عن كلمة مرور مدير محلّيّ مشتركة لكلّ الحواسيب
كلمة مرور مدير محلّيّ مشتركة لكلّ الحواسيب مرتع لهجوم Pass-the-Hash ينتقل فيه اختراق جهاز واحد إلى الجميع. يشرح المقال التدوير التلقائيّ ...
نسخة الظلّ لوحدة التخزين (VSS): الآليّة والممارسة ── لماذا تستطيع برمجيّات النسخ الاحتياطيّ نسخ ملفّات قيد الاستخدام
الملفّات قيد الاستخدام لا تُنسَخ عادة بسبب انتهاك المشاركة، فكيف تتمكّن برمجيّات النسخ الاحتياطيّ من ذلك؟ يشرح المقال أدوار الطالب والكات...
استخدام WMI/CIM من C# وPowerShell ── دليل عمليّ لاسترجاع معلومات العتاد ومراقبة العمليّات والاستعلام عن بُعد
الإجابة الكلاسيكيّة للحصول على الرقم التسلسليّ للحاسوب، ومراقبة المساحة الحرّة على القرص، وكشف بدء عمليّة هي WMI/CIM. يشرح المقال أوامر C...
دليل عمليّ لنهج المجموعة (GPO) ── كيف يعمل، وتأكيد التطبيق، والاختيار بين GPO وIntune
هل تعمل في بيئة AD دون أن تعرف حقّاً ماذا يعني «موزَّع عبر GPO»؟ يشرح المقال عمليّاً كيف يعمل نهج المجموعة وترتيب تطبيق LSDOU، وتأكيد الا...
أين يتصل هذا الموضوع
ترتبط هذه المقالة بشكل طبيعي بصفحات الخدمات التالية.
تطوير تطبيقات ويندوز
ندعم تطوير برامج ويندوز للأعمال، وتكامل الأجهزة، وأدوات التواصل.
الأسئلة الشائعة
أسئلة شائعة حول موضوع هذه المقالة.
- ما الفرق بين certmgr.msc وcertlm.msc؟
- يستهدفان مخزنين مختلفين. يفتح certmgr.msc مخزن شهادات المستخدم المسجَّل دخوله حالياً (المستخدم الحاليّ، CurrentUser)؛ ويفتح certlm.msc مخزن شهادات الحاسوب (الحاسوب المحلّيّ، LocalMachine). مخزن الحاسوب مشترك بين كلّ مستخدم وخدمة على الحاسوب، وإدارته تحتاج امتيازات مدير. مستخدم غير مدير يدير مخزن مستخدمه فقط. داخل الاثنين تنقسم المحتويات إلى مخازن منطقيّة مثل «شخصيّ» و«مراجع التصديق الجذريّة الموثوقة»، ومن PowerShell ترون البنية نفسها كـ Cert:\CurrentUser وCert:\LocalMachine.
- أين تُوضَع شهادة العميل، مخزن المستخدم أم مخزن الحاسوب؟
- يتوقّف على «من» يعمل البرنامج الذي يستخدم الشهادة بوصفه. لتطبيق سطح مكتب يشغّله مستخدم تفاعليّ، مخزن مستخدم الشخص الذي يستخدمه (Cert:\CurrentUser\My) هو الاختيار الافتراضيّ. لبرنامج يعمل دون مراقبة — خدمة Windows أو مجمع تطبيقات IIS أو جدولة المهام — ضعوه في مخزن الحاسوب (Cert:\LocalMachine\My) وامنحوا حساب التشغيل إذن قراءة المفتاح الخاصّ. لأنّ مخزن المستخدم منفصل لكلّ حساب، فشهادة وضعها مطوّر في مخزن مستخدمه غير مرئيّة لخدمة تعمل تحت حساب آخر. هذا السبب الكلاسيكيّ لـ«عمل أثناء التطوير لكن لا يُعثَر عليه في الإنتاج».
- ماذا أفحص عندما لا تجد خدمة Windows الشهادة أو لا تستطيع استخدامها؟
- افحصوا أمرين بالترتيب. أوّلاً، أيّ مخزن تنظر إليه. إن فتحت الشيفرة StoreLocation.CurrentUser، فذلك مخزن مستخدم حساب تشغيل الخدمة، لا المخزن الذي يراه مدير عندما يفتح certmgr.msc لنفسه. انقلوا الشهادة إلى مخزن الحاسوب وحاذوا الشيفرة مع StoreLocation.LocalMachine. ثانياً، هل يُقرأ المفتاح الخاصّ فعلاً. الظهور في قائمة الشهادات والقدرة على الاستخدام شيئان مختلفان — افتراضيّاً لا يصل إلى المفتاح الخاصّ في مخزن الحاسوب عادةً إلا المديرون وSYSTEM. افتحوا «إدارة المفاتيح الخاصّة» للشهادة في certlm.msc وامنحوا «قراءة» لحساب تشغيل الخدمة (NETWORK SERVICE أو نحوه).
- كيف ألتقط انتهاء أجل الشهادة مسبقاً بـ PowerShell؟
- يمكن الجرد بـ Get-ChildItem على محرّك Cert:. مثلاً، Get-ChildItem Cert:\LocalMachine\My | Sort-Object NotAfter | Format-Table Thumbprint, Subject, NotAfter يسرد المخزن الشخصيّ لمخزن الحاسوب بترتيب تاريخ الانتهاء. معامل -ExpiringInDays يتيح استخراج «شهادات تنتهي خلال العدد المعطى من الأيّام» فقط؛ تمرير 0 يعيد شهادات انتهت أصلاً. شغّلوا هذا شهريّاً ضدّ كلّ خادم وقاطعوا النتائج بسجلّ شهادات، فتكاد تقضون على حوادث «لا يمكن المصادقة من صباح الاثنين لأنّ شهادة انتهت».
الملف الشخصي للمؤلف
صفحة الملف الشخصي لمؤلف المقالة.
غو كومورا
مؤسّس شركة كومورا سوفت ذ.م.م.
يركّز على تطوير برامج ويندوز، والاستشارات التقنية، والتحقيق في الأخطاء، ويتميّز في المشاريع التي تبقى فيها الأصول القديمة ناشطة، وفي تشخيص الأعطال التي يصعب تحديد سببها.