دليل مخزن شهادات 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 دون مراقبة مجموعة واحدة مع مخزن الحاسوب ومنح أذون المفتاح الخاصّ، وانتهاء أجل الشهادة وبصمة الإبهام المثبَّتة هما السببان الكلاسيكيّان لعطل اتّصال ناجم عن الشهادة.

خريطة معرفة الدليل العمليّ لمخزن شهادات Windowsمخطّط يبيّن علاقات مخزن الشهادات (مستخدم/حاسوب)، وشهادة العميل، والمفتاح الخاصّ، وسلسلة الشهادات، ومرجع التصديق الجذريّ والوسيط، وانتهاء الأجل والبصمة وعطل الاتّصال، وإجراء الاستبدال والسجلّ وخطر الشهادة الموقعة ذاتيّاًيستخدميشترطيشترطيشترطيشترطقد يسبّبقد يسبّبيُتحقّق بـيُكوَّن بـيُكوَّن بـيُتحقّق بـيُتحقّق بـيُتحقّق بـيُتحقّق بـيُحفظ فييُتحقّق بـيُحفظ فييستخدميُحفظ فييُكوَّن بـيمنعيمنعقد يسبّبغير موصى به لـغير موصى به لـموصى به لـيرث محتوىيُحفظ فيقد يسبّبيستخدميشترطيستخدمقد يسبّبغير موصى به لـيشترطينبغي أن يسبقيستخدميخفّفيشترطموصى به لـموصى به لـمخزن الشهاداتشهادة العميلخدمة Windowsمخزن شهادات الحاسوبالمفتاح الخاصّأذون المفتاح الخاصّسلسلة الشهاداتشهادة مرجع التصديق الوسيطشهادة مرجع التصديق الجذريّانتهاء أجل الشهادةعطل اتّصال ناجم عن الشهادةتثبيت البصمة في الشيفرةنهج المجموعةMicrosoft Intuneمخزن شهادات المستخدمcertmgr.msccertlm.mscمحرّك Cert:ملفّ PFXcertutilشهادة توقيع الشيفرةمخزن الناشرين الموثوقينتطبيق سطح مكتب لمستخدم تفاعليّاستبدال الشهادةسجلّ الشهاداتشهادة موقعة ذاتيّاً ارتجاليّةخطر إساءة استخدام نقطة انطلاق الثقةاختيار الشهادة (بحث)مخزن «شخصيّ» (My)الخلط بين المخازنمجمع تطبيقات IISتشغيل غير مراقب عبر جدولة المهاماستيراد قابل للتصديرخطر إخراج المفتاح الخاصّمنح Everyone تحكّماً كاملاًالتسجيل المسبق للشهادة لدى الطرف المقابلالتبديل إلى الشهادة الجديدةصنف X509Storeبحث شهادات بتعيين validOnlyسمة استخدام المفتاح (Key Usage)إخراج البصمة إلى التكوينإخراج الشهادة المختارة إلى السجلّ

في المخطّط، يشير الخطّ المتّصل إلى علاقة قائمة دائماً، ويشير الخطّ المتقطّع إلى علاقة مشروطة (شروط قيامها مذكورة في شرح كلّ علاقة في الصفحة التفصيليّة). القائمة الكاملة للعلاقات (المجموع 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 مثلاً، إن وضعتم شهادة مرجع تصديق داخليّ في «مراجع التصديق الجذريّة الموثوقة» لمخزن الحاسوب، تظهر تلك الشهادة أيضاً في «مراجع التصديق الجذريّة الموثوقة» لكلّ مستخدم. بالمقابل، مخزن «شخصيّ» وحده لا يُورَث، لذا لشهادات العميل (= ما يُوضَع في المخزن الشخصيّ) عليكم أنتم أن تقرّروا «من يحتاج أن يراها». هذا اللاتناظر بطل المقال كلّه.

مخزن الحاسوب ومخزن المستخدممخزن الحاسوب واحد للحاسوب ومشترك لكلّ المستخدمين والخدمات، ومخزن المستخدم منفصل لكلّ حساب ويرث غير الشخصيّ من جانب الحاسوب ويظهرهالمستخدم (CurrentUser)منفصل لكلّ حسابالحاسوب (LocalMachine)واحد للحاسوب · مشترك لكلّ المستخدمين والخدماتيُرى بوروث المحتوىيُورَثيُورَثشخصيّ (My)※ لا يُورَث = تقرّرون أنتم أين تضعونمراجع التصديق الجذريّة الموثوقة (Root)مراجع التصديق الوسيطة (CA)الناشرون الموثوقون (TrustedPublisher)شخصيّ (My)مراجع التصديق الجذريّة الموثوقة (Root)مراجع التصديق الوسيطة (CA)الناشرون الموثوقون (TrustedPublisher)

الشكل 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. تشريح الحادث الكلاسيكيّ ── «عمل أثناء التطوير لكن لا يُعثَر عليه بعد أن صار خدمة»

يمكن إعادة إنتاج هذا الحادث بدقّة بالإجراء التالي.

  1. ينقر المطوّر نقراً مزدوجاً على pfx على حاسوبه ليستورد. افتراضيّ المعالج «المستخدم الحاليّ»، فتدخل الشهادة مخزن مستخدم حساب المطوّر.
  2. تطبيق أثناء التطوير يعمل من Visual Studio، أي بحساب المطوّر، فيُعثَر على الشهادة بفتح StoreLocation.CurrentUser. يعمل.
  3. يُسجَّل كخدمة Windows على خادم الإنتاج. تعمل الخدمة تحت NETWORK SERVICE أو حساب مخصَّص.
  4. CurrentUser الذي تفتحه شيفرة الخدمة هو مخزن مستخدم حساب تشغيل الخدمة. هناك فارغ. «الشهادة غير موجودة».
عمل أثناء التطوير لكن لا يُعثَر عليه بعد أن صار خدمةشهادة وُضعت في مخزن مستخدم المطوّر غير مرئيّة من CurrentUser لخدمة تعمل تحت حساب آخرخادم الإنتاجآلة التطويروضع البرنامج نفسهCurrentUser الذي تفتحه الشيفرة هومخزن مستخدم حساب الخدمةالتسجيل كخدمة Windowsحساب التشغيل NETWORK SERVICE أو نحوههناك فارغ→ «الشهادة غير موجودة»يدخل مخزن مستخدمحساب المطوّراستيراد بنقر مزدوج على pfxافتراضيّ المعالج «المستخدم الحاليّ»التشغيل من Visual Studio= يعمل بحساب المطوّريفتح CurrentUser فيُعثَر عليه→ يعمل

الشكل 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

  1. افتحوا certlm.msc (أو ميزة الشهادات المستهدفة لحساب الحاسوب).
  2. انقروا بالزرّ الأيمن الشهادة المستهدفة في «شخصيّ» → «شهادات»، وافتحوا «إدارة المفاتيح الخاصّة» من «كلّ المهام».
  3. في علامة التبويب «أمن» أضيفوا حساب التشغيل (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. إجراء الاستبدال ── فترة توازٍ القديم والجديد وفخّ البصمة

تحديث الشهادة ليس «احذفوا ثمّ ضعوا» بل «أضيفوا ثمّ بدّلوا، وأكّدوا ثمّ احذفوا».

  1. استوردوا الشهادة الجديدة (pfx) إلى المخزن نفسه. البصمة مختلفة، فيمكن للقديم والجديد التعايش في المخزن نفسه.
  2. امنحوا أذون المفتاح الخاصّ للشهادة الجديدة (الفصل 4). هذا أكثر ما يُنسى عند التحديث. الأذون تلحق بكلّ مفتاح خاصّ للشهادة، فبعد استبدال الشهادة يُعاد المنح أيضاً.
  3. أنجزوا الإبلاغ إلى نظام الطرف المقابل (لواجهات برمجة تحتاج تسجيلاً مسبقاً للشهادة) مع مواصلة التشغيل بالشهادة القديمة أوّلاً، واضمنوا فترة توازٍ يُقبل فيها الاثنان. إن قدّمتم التبديل، يرفض الطرف المقابل الشهادة الجديدة فيتوقّف اتّصال الإنتاج.
  4. بدّلوا تكوين التطبيق إلى الشهادة الجديدة، وأكّدوا التشغيل.
  5. بعد فترة كافية، احذفوا الشهادة القديمة.
تحديث الشهادة إضافة ثمّ تبديلتضعون pfx الجديد في المخزن نفسه وتمنحون الأذون وتسجّلون مسبقاً لدى الطرف المقابل ثم تبدّلون البصمة، وبعد فترة التوازي تحذفون الشهادة القديمة1. استيراد pfx الجديد إلىالمخزن نفسه (تعايش قديم وجديد)2. منح أذون المفتاح الخاصّللشهادة الجديدة3. تسجيل مسبق لدى الطرف المقابل(مواصلة التشغيل بالشهادة القديمة)4. إعادة كتابة بصمة التكوينوالتبديل وتأكيد التشغيل5. بعد فترة التوازيحذف الشهادة القديمة

الشكل 3: ترتيب استبدال الشهادة إضافة → أذون → تسجيل مسبق → تبديل التكوين → حذف القديمة؛ ولا تنسوا تحديث البصمة.

أكبر فخّ عندئذٍ بصمة إبهام مكتوبة في ملفّ تكوين أو شيفرة. البصمة فريدة لكلّ شهادة، فتتغيّر حتماً بالتحديث. إن بقي موضع واحد يشير إلى البصمة القديمة، يحدث «حدّثنا الشهادة لكن لا يتّصل». الموثوق إدارة أين كُتبت البصمة (تكوين التطبيق، ربط IIS، سكربت، إبلاغ الطرف المقابل) في سجلّ.

5.3. توصية بسجلّ شهادات

السجلّ يكفي فيه أوّلاً ورقة Excel واحدة. كحدّ أدنى اصنعوا أعمدة الغرض / المُصدِر / الموضوع / البصمة / الموضع (اسم الخادم + المخزن) / الحسابات التي تملك أذون المفتاح الخاصّ / الأجل / رابط إجراء التحديث / المسؤول، وقاطعوا بنتائج جرد 5.1. واقع حوادث الشهادات ليس مشكلة تقنيّة بل مشكلة «لا أحد يملك قائمة»، فالسجلّ هو الأكثر فاعليّة.

6. قراءة التحقّق والفشل ── السلسلة وتوزيع الجذر

6.1. أساسيّات تحقّق السلسلة وcertutil

أخطاء عائلة «هذه الشهادة غير موثوقة» حالة انقطاع السلسلة (مسار الإثبات) من شهادة النهاية إلى مرجع التصديق الجذريّ في موضع ما. للعزل certutil ملائم.7

ثلاثة أسباب كلاسيكيّة لانقطاع تحقّق السلسلةيتعذّر الحصول على مرجع التصديق الوسيط، أو الجذر غير موزَّع، أو النهاية منتهية الأجل، فينتج خطأ ثقة بأحد هذهيتعذّر الحصول عليها(عرض أو AIA أو مخزن، أيّ منها)غير موزَّعةانتهى الأجلشهادة النهاية(شهادة عميل أو شهادة خادم)شهادة مرجع التصديق الوسيطموضعها: مخزن مراجع التصديق الوسيطة (CA)شهادة مرجع التصديق الجذريّموضعها: مراجع التصديق الجذريّة الموثوقة (Root)لا يمكن بناء السلسلة(السبب الكلاسيكيّ 1)خطأ «غير موثوقة»(السبب الكلاسيكيّ 2)خطأ فترة الصلاحيّة(السبب الكلاسيكيّ 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، وتشغيل وضع موقع ذاتيّاً في الجذر مقصور على بيئة التحقّق وبأجل.
  • في الشيفرة أخرجوا البصمة إلى التكوين، واتركوا الشهادة المختارة في السجلّ. ذلك وحده يغيّر التعامل مع الأعطال الناجمة عن الشهادات تغييراً بيّناً.

مقالات ذات صلة

مجالات الاستشارة ذات الصلة

تتعامل شركة كومورا سوفت ذ.م.م. مع تطوير تطبيقات أعمال تدمج تكامل واجهة برمجة ويب بشهادة عميل (واجهات برمجة بنوك، التحقّق من الأهليّة عبر الإنترنت، إلخ)، والتحقيق في أعطال من نوع «الشهادة غير موجودة» و«بعد التحديث لا يتّصل»، وترتيب إجراءات استبدال الشهادات. يصحّ الاستشارة من مرحلة «لا نعرف أيّ مخزن ننظر إليه».

روابط مرجعيّة

  1. Microsoft Learn, Local Machine and Current User Certificate Stores. حول كون مخزن شهادات الحاسوب محلّيّاً للحاسوب ومشتركاً لكلّ المستخدمين وتحت HKEY_LOCAL_MACHINE، وكون مخزن شهادات المستخدم لكلّ حساب مستخدم وتحت HKEY_CURRENT_USER، ووراثة مخزن المستخدم لمحتوى مخزن الحاسوب باستثناء مخزن «شخصيّ» (ظهور شهادة أُضيفت إلى «مراجع التصديق الجذريّة الموثوقة» للحاسوب في المخزن نفسه لكلّ مستخدم).  2 3 4

  2. 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

  3. Microsoft Learn, How to: View certificates with the MMC snap-in. حول كون certlm.msc أداة تدير شهادات الجهاز المحلّيّ (الحاسوب المحلّيّ) وcertmgr.msc شهادات المستخدم الحاليّ، وكون أهداف ميزة الشهادات ثلاثة أنواع «حساب حاسوب» و«حساب مستخدم» و«حساب خدمة»، وأنّ مستخدماً غير مدير يدير شهادات حساب مستخدمه فقط.  2 3 4

  4. Microsoft Learn, about_Certificate_Provider. حول كون محرّك Cert: في PowerShell فضاء أسماء تراتبيّاً بموضعي مخزن CurrentUser وLocalMachine، وإمكان تعداد المخازن والشهادات بـ Get-ChildItem، وعودة معامل -ExpiringInDays لشهادات تنتهي خلال العدد المحدَّد من الأيّام (0 لما انتهى أصلاً)، والمعاملات الديناميكيّة مثل -CodeSigningCert، وتخزين الأجل في خاصّيّة NotAfter، وتعريف الشهادات ببصمة الإبهام.  2 3 4 5 6

  5. Microsoft Learn, How to Modify Private Key Permissions to Support Management Server or Streaming Server. حول إجراء فتح «إدارة المفاتيح الخاصّة» (Manage Private Keys) في ميزة الشهادات المستهدفة لمخزن شهادات الحاسوب المحلّيّ، وإضافة إذن وصول «قراءة» لحساب تشغيل الخدمة (مثال: Network Service) في علامة التبويب «أمن».  2 3

  6. Microsoft Learn, Import-PfxCertificate. حول جلب Import-PfxCertificate الشهادة والمفتاح الخاصّ من ملفّ PFX إلى المخزن المحدَّد، وتعذّر تصدير المفتاح الخاصّ المُجلَب إن لم يُحدَّد مفتاح -Exportable، وصيغة معاملات -CertStoreLocation و-Password و-FilePath وأمثلة الاستخدام.  2 3

  7. Microsoft Learn, certutil. حول تحقّق certutil -verify من الشهادة وCRL وسلسلة الشهادات وبنائه سلسلة كاملة والتحقّق منها إن لم يُحدَّد ملفّ شهادة مرجع التصديق، وإتاحة خيار -urlfetch، وتفريغ مخزن الشهادات بـ certutil -store والوصول إلى مخزن المستخدم بدل مخزن الحاسوب بخيار -user.  2

  8. Microsoft Learn, Distribute Certificates to Client Computers by Using Group Policy. حول إجراء استيراد شهادة إلى «مراجع التصديق الجذريّة الموثوقة» تحت «تكوين الحاسوب\السياسات\إعدادات Windows\إعدادات الأمن\سياسات المفتاح العامّ» في نهج المجموعة لتوزيعها إلى حواسيب العملاء في النطاق، والأذون اللازمة (مكافئ Domain Admins / Enterprise Admins). 

  9. Microsoft Learn, Create trusted certificate profiles in Microsoft Intune. حول كون ملفّ شخصيّ «شهادات موثوقة» في Intune آليّة لتوزيع شهادات مرجع تصديق جذريّ أو وسيط إلى الأجهزة المُدارة، واستخدامه لتأسيس الثقة بمرجع التصديق الجذريّ كمقدّمة لملفّات شخصيّة شهادات SCEP/PKCS، وإمكان اختيار مخزن الوجهة على Windows كـ«مخزن شهادات الحاسوب - جذر» و«مخزن شهادات الحاسوب - وسيط» و«مخزن شهادات المستخدم - وسيط». 

  10. Microsoft Learn, X509Store Class. حول إمكان بناء X509Store بتعيين StoreName وStoreLocation (CurrentUser / LocalMachine)، وفتح المخزن بطريقة Open وOpenFlags (ReadOnly وOpenExistingOnly وغيرها)، وجلب مجموعة الشهادات بخاصّيّة Certificates، وتضمّن أسماء المخازن القياسيّة My وRoot وCA وTrustedPublisher وغيرها، ووجود مخزن TrustedPublisher في CurrentUser وLocalMachine كليهما.  2

  11. Microsoft Learn, X509Certificate2Collection.Find(X509FindType, Object, Boolean) Method. حول بحث طريقة Find عن شهادات بـ X509FindType (FindByThumbprint وغيرها) وقيمة البحث، وعودة الشهادات الصالحة التي اجتازت التحقّق فقط عند تعيين المعامل الثالث validOnly إلى true.  2

  12. Microsoft Learn, HttpClientHandler.ClientCertificates Property. حول كون خاصّيّة ClientCertificates مجموعة X509CertificateCollection تُعرَض على الخادم في مصادقة العميل القائمة على الشهادة، ولزوم تضمين «Digital Signature» في .NET Core إن وُجدت سمة استخدام المفتاح في الشهادة.  2

أحدث المقالات التي تشترك في نفس الوسوم. عمّق فهمك بمواضيع مرتبطة.

ترتبط هذه المقالة بشكل طبيعي بصفحات الخدمات التالية.

الأسئلة الشائعة

أسئلة شائعة حول موضوع هذه المقالة.

ما الفرق بين 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 يعيد شهادات انتهت أصلاً. شغّلوا هذا شهريّاً ضدّ كلّ خادم وقاطعوا النتائج بسجلّ شهادات، فتكاد تقضون على حوادث «لا يمكن المصادقة من صباح الاثنين لأنّ شهادة انتهت».

الملف الشخصي للمؤلف

صفحة الملف الشخصي لمؤلف المقالة.

غو كومورا

مؤسّس شركة كومورا سوفت ذ.م.م.

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

العودة إلى المدونة