التحكم في طلبات الشهادة في IIS باستخدام PowerShell

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

لنوضح شيئًا واحدًا. أنا أكره علم التشفير والشهادات. على مدى مسيرتي المهنية، كنت “رجل الشهادات” في بعض الحالات. ومع ذلك، كانت مجرد قبعة أخرى لمسؤول النظام.

I never got to the point where I completely understood the technology and it seemed like every task I tried to accomplish around that area seemed to never work out. It’s definitely an unforgiving technology for sure.

اسمحوا لي أن أحكي لكم قصة حول أتمتة عملية تثبيت شهادة على خادم IIS باستخدام PowerShell.

المهمة

من العميل، طلب شهادة Digicert عامة جديدة، تثبيتها على خادم Windows Server 2012 R2 Core عن بُعد يعمل بنظام IIS 8.5 في مجموعة عمل، ثم تحديد ربط SSL لموقع واستخدام الشهادة المثبتة للربط. بسيط، أليس كذلك؟ هههه!

كيف تم ذلك، يا صديقي!

باختصار، يتطلب ذلك X خطوة لجعل هذا يحدث.

  1. إنشاء طلب توقيع لشهادة IIS على الكمبيوتر الذي سيتم تثبيت الشهادة فيه. في حالتي، كان لدي الوصول إلى WinRM فقط، لذا كان علي تنفيذ certreq.exe على الخادم عن بُعد باستخدام Invoke-Command وإرسال محتوى CSR إلى ملف محلي.
  2. الحصول على CSR الموقع من قبل CA عامة. (لا مساعدة هنا – عادت شهادة جميلة للتو من الأمان الذي عملت معه). في حالتي، قدم لي فريق الأمان مجموعة من شهادات P7B المدمجة في ملف .CER والتي تتضمن الشهادة التي كنت أبحث عنها بالإضافة إلى الشهادات الوسيطة. استغرق هذا بعض التلاعب للعمل.
  3. اكتمل طلب توقيع الشهادة على الحاسوب الذي سيتم تثبيت الشهادة فيه. سيتم بهذا الحصول على الشهادة في مخزن الشهادات.
  4. إنشاء ارتباط ويب SSL IIS على الخادم.
  5. ربط الشهادة بارتباط الويب.

إنشاء طلب شهادة IIS

سيكون مهمتك الأولى هي تشغيل certreq.exe بهذا البرنامج النصي PowerShell على الخادم البعيد لجمع ملف الطلب. للقيام بذلك، يتطلب certreq.exe ملف INF كإدخال. يُستخدم هذا الملف لجميع الخيارات المختلفة التي ستكون للشهادة الخاصة بك في النهاية. بدون الدخول في تفاصيل كثيرة، هذا نسخة من ملف INF الذي كنت أستخدمه.

[Version]
Signature = "$Windows NT$"
[NewRequest]
Subject = "C=US,S=State,L=City,O=Company,OU=IT,CN=Name"
Exportable = TRUE
KeyLength = 2048
KeySpec = 1
KeyUsage = 0xa0
MachineKeySet = True
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
Silent = True
SMIME = False
RequestType = PKCS10

سترى في الوظيفة New-CertificateSigningRequest أنني جعلت من السهل بشكل كبير عليك تخصيص هذا. في الواقع، إذا استخدمت وظائفي لن ترى هذا الملف أبدًا لأنه يُطلب مؤقتًا فقط لإنشاء CSR (ملف الطلب).

بعد ذلك، ستحتاج إلى الحصول على هذا الملف INF على الخادم البعيد وتشغيل certreq.exe بالمعلمات التالية مثل certreq.exe -new "$InfFilePath" "$reqFilePath".

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

Certificate service request in the Windows MMC snapin

اكتمال طلب شهادة IIS

في حالتي، حصلت على ملف CER واحد. قمت بإنشاء وظيفة في نص PowerShell IIS هذا لاستيراده مباشرة إلى مخزن الشخصية في سياق الجهاز المحلي لأجد أن IIS لا يمكنه رؤيته. السبب في ذلك كان أن الشهادة يجب أن تحتوي أيضًا على المفتاح الخاص. لن يعمل استيراد الشهادة ببساطة إلى مخزن الشخصية. كان علي استكمال طلب الشهادة باستخدام certreq.exe.

للقيام بذلك، ستحتاج إلى نسخ الشهادة التي تتلقاها من فريق الأمان الخاص بك على الخادم عن بُعد ثم تنفيذ certreq.exe بهذا الشكل certreq.exe -accept -machine "C:\issuedcert.cer".

سيتعين عليك دائمًا التأكد من أن شهادة الاستجابة تذهب دائمًا إلى سياق الجهاز المحلي باستخدام المعامل -machine. هذا يجب أن يكتمل بنجاح وفقًا لكل ما قرأته ولكن بالتأكيد لم يحدث ذلك بالنسبة لي. لسبب ما، كنت أتلقى خطأ يبدو كما يلي:

Error requesting certificate

اتضح أن هذا يعني أن المفتاح العام في ملف الطلب لا يتطابق مع ما عاد من فريق الأمان. لاختبار هذا، قم ببساطة بتشغيل certutil.exe -dump requestfile.req و certutil -dumpissuedcert.cer. انتقل لأسفل من النتيجة حتى ترى منطقة المفتاح العام.

Encrypted public key

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

إذا كانت تتطابق، فأنت في وضع جيد ولا يجب أن تتلقى هذا الخطأ.

قم بإنشاء ربط SSL

على الخادم عن بُعد، قم بتشغيل الأمر التالي:

PS> Import-Module WebAdministration
PS> New-WebBinding -Name $WebsiteName -IP * -Port 443 -Protocol https

قم بربط الشهادة بربط SSL

على الخادم عن بُعد، قم بتشغيل الأمر التالي:

PS> $certificate = Get-Item Cert:\localmachine\My\$Thumbprint
PS> $certificate | New-Item "IIS:\SSLBindings\0.0.0.0!443"

احصل على سكريبت PowerShell IIS

إذا كان كل شيء على ما يرام، يجب أن تكون قد انتهيت! الآن، إذا كنت بحاجة إلى قليل من المساعدة في القيام بذلك، قمت بإنشاء ثلاث وظائف لتسهيل العملية بشكل كبير. انتقل إلى مستودع Github الخاص بي للحصول على الوظائف:

https://github.com/adbertram/Random-PowerShell-Work/tree/master/Certificates

https://github.com/adbertram/Random-PowerShell-Work/tree/master/IIS

كود مثال

## أرسل الملف الذي يخرج هذا إلى أشخاص الشهادات الخاصة بك 
New-CertificateSigningRequest -SubjectHost 'somesubject' -FilePath 'C:\somefile.req' -ComputerName REMOTESERVER

## قم بتوريد الشهادة المستلمة
Import-CertificateSigningRequestResponse -FilePath C:\issuedcert.cer -ComputerName REMOTESERVER

## قم بإنشاء الربط وربط الشهادة.
New-IISWebBinding -ComputerName 'zapp09rpr01' -WebsiteName GHI -Protocol https -Port 443 -Certificate $cert

قراءة ذات صلة

تأكد من الاطلاع على مقالات مدونة ATA الأخرى حول إدارة IIS باستخدام PowerShell

Source:
https://adamtheautomator.com/iis-certificate-request/