मैं किसी साइट पर https बाइंडिंग जोड़ने की कोशिश कर रहा था और यह बहुत दर्दनाक हो सकता है। प्रत्येक चरण को पूरा करने के लिए बहुत सारे तरीके हैं और प्रत्येक में नुकसान है। मैं अंतिम समाधान की उम्मीद कर रहा हूं कि कोई इसे उपयोगी समझेगा।
यह समाधान मानता है कि आपके पास IIS स्थापित है और एक वेब साइट परिभाषित है। इस पोस्ट के प्रयोजनों के लिए साइट sample.contoso.com पर कॉल करें। मान लें कि आपके पास sample.contoso.com.pfx फ़ाइल में एक प्रमाणपत्र है जिसे आप भी उपयोग करना चाहते हैं।
पहला कदम फ़ाइल से प्रमाण पत्र आयात करना है।
$certPwd = ConvertTo-SecureString -String "password" -Force -AsPlainText
$webServerCert = Import-PfxCertificate -FilePath c:\some\folder\sample.contoso.com.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $certPwd
यह पर्याप्त होगा तो अच्छा होगा। और कुछ मामलों में यह हो सकता है। हालांकि, मेरे लिए, इसने निजी कुंजी तक उचित पहुंच के बिना प्रमाण पत्र छोड़ दिया। इसके कारण एक पॉवरशेल त्रुटि हुई "एक निर्दिष्ट लॉगऑन सत्र मौजूद नहीं है। यह पहले से ही समाप्त हो सकता है" जब मैं प्रमाण पत्र को बाइंडिंग में जोड़ने गया था (बाद में वह चरण देखें)। तो, अगला कदम निजी कुंजी के लिए एसीएल को ठीक करना है।
$privateKeyFilename = $webServerCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
$privateKeyFullPath = "c:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\"+$privateKeyFilename
$aclRule = "SYSTEM", "Full", "Allow"
$aclEntry = New-Object System.Security.AccessControl.FileSystemAccessRule $aclRule
$privateKeyAcl = (Get-Item $privateKeyFullPath).GetAccessControl("Access")
$privateKeyAcl.AddAccessRule($aclEntry)
Set-Acl $privateKeyFullPath $privateKeyAcl
यह स्थानीय सिस्टम को निजी कुंजी तक पूर्ण पहुंच प्रदान करने की अनुमति देगा यदि वह युक्त फ़ोल्डर से विरासत में नहीं मिला है।
यदि आप एक प्रमाणपत्र प्राप्त करना चाहते हैं जो पहले से ही स्थापित है, तो आपको इसके लिए हैश चाहिए और गेट-आइटम के साथ इसे पुनः प्राप्त कर सकते हैं:
$webServerCert = get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95
अगला कदम बंधन बनाना है।
New-WebBinding -Name sample.contoso.com -IPAddress * -Port 443 -Protocol "https"
यह ध्यान रखना महत्वपूर्ण है कि "https" केस संवेदी है। यदि आप इसके बजाय "HTTPS" का उपयोग करते हैं, तो आपको वास्तव में अलग बाध्यकारी परिणाम मिलता है।
इस बाइंडिंग में अभी तक कोई प्रमाणपत्र संलग्न नहीं है, इसलिए अंतिम चरण प्रमाण पत्र संलग्न करना है। यदि प्रमाण पत्र ठीक से विश्वसनीय है और सुरक्षा सही है, तो यह चरण सफल होना चाहिए। यदि यह प्रमाणपत्र के साथ कोई समस्या है, तो यह नकचढ़ा हो सकता है।
$bind = Get-WebBinding -Name $webSiteDNSName -Protocol https
$bind.AddSslCertificate($webServerCert.GetCertHashString(), "my")
यदि यह लॉगऑन सत्र के बारे में एक संदेश के साथ विफल रहता है, तो प्रमाणपत्र में कुछ समस्या हो सकती है। अधिक विवरण के लिए इवेंट व्यूअर की समीक्षा करें। अपने प्रयासों के दौरान, मुझे सुरक्षा लॉग में इवेंट 5061 मिला। जब यह विफल हो गया, तो यह पता चला कि OpenKey 80090016 के साथ विफल हुआ (The Keyset does Exist)। और विफलता इसलिए थी क्योंकि सिस्टम के पास निजी कुंजी तक पहुंच नहीं थी।
मेरे लिए https बाइंडिंग बनाना पर्याप्त था। Http बाइंडिंग, न्यू-वेबसाइट cmdlet का उपयोग करने का एक अनुत्पादक था। यदि यह मुफ्त में नहीं आता है, तो मैंने चुनौती के रूप में न्यू-वेबबाइंडिंग cmdlet के साथ पोर्ट 80 बाइंडिंग बनाने को नहीं पाया।