ฉันผ่านขั้นตอนการพยายามเพิ่มการเชื่อมโยง 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
มันคงจะดีถ้ามันเพียงพอ และในบางกรณีก็อาจจะเป็น อย่างไรก็ตามสำหรับฉันแล้วสิ่งนี้ได้ทิ้งใบรับรองไว้โดยไม่สามารถเข้าถึงคีย์ส่วนตัวได้ สิ่งนี้ทำให้เกิดข้อผิดพลาด powershell "เซสชันการเข้าสู่ระบบที่ระบุไม่มีอยู่อาจถูกยกเลิกแล้ว" เมื่อฉันไปเพิ่มใบรับรองลงในการเชื่อมโยง (ดูขั้นตอนนั้นในภายหลัง) ดังนั้นขั้นตอนต่อไปคือการแก้ไข ACL สำหรับคีย์ส่วนตัว
$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
การทำเช่นนี้จะทำให้ระบบภายในเครื่องมีการเข้าถึงคีย์ส่วนตัวได้อย่างเต็มที่หากไม่ได้รับมรดกจากโฟลเดอร์ที่บรรจุ
หากคุณต้องการได้รับใบรับรองที่ติดตั้งไว้แล้วคุณต้องใช้แฮชและสามารถเรียกดูได้ด้วย Get-Item ดังนี้:
$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 ไม่มีอยู่) และความล้มเหลวก็เพราะระบบไม่สามารถเข้าถึงคีย์ส่วนตัว
นั่นก็เพียงพอแล้วสำหรับฉันที่จะสร้างการเชื่อมโยง https การเชื่อมโยง http เป็นผลพลอยได้จากการใช้ cmdlet ของ New-WebSite หากไม่ได้มาฟรีฉันไม่พบการสร้างพอร์ต 80 ที่เชื่อมโยงกับ cmdlet New-WebBinding ให้เป็นสิ่งที่ท้าทาย