Bir siteye https bağlaması eklemeye çalıştım ve oldukça acı verici olabilir. Her adımı gerçekleştirmenin birçok yolu vardır ve her birinin tuzakları vardır. Birinin yararlı bulacağını ümit ederek nihai çözümü geride bırakıyorum.
Bu çözüm, IIS'nin yüklü olduğunu ve bir web sitesinin tanımlandığını varsayar. Bu yazının amaçları için sample.contoso.com sitesini arayın. Kullanmak istediğiniz sample.contoso.com.pfx dosyasında bir sertifikanız olduğunu varsayalım.
İlk adım sertifikayı dosyadan içe aktarmaktır.
$certPwd = ConvertTo-SecureString -String "password" -Force -AsPlainText
$webServerCert = Import-PfxCertificate -FilePath c:\some\folder\sample.contoso.com.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $certPwd
Bu yeterli olsaydı iyi olurdu. Ve bazı durumlarda olabilir. Ancak, benim için bu, özel anahtara düzgün erişim olmadan sertifikayı bıraktı. Bu, bağlayıcıya sertifika eklemeye gittiğimde "Belirtilen oturum açma oturumu yok. Zaten sonlandırılmış olabilir" hatasına neden oldu (bu adıma daha sonra bakın). Bir sonraki adım, özel anahtar için ACL'yi düzeltmektir.
$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
Bu, yerel sistemin, içerdiği klasörden devralınmamışsa özel anahtara tam erişimine izin verir.
Önceden yüklenmiş bir sertifika almak istiyorsanız, bunun için karmaya ihtiyacınız vardır ve aşağıdaki gibi Get-Item ile alabilirsiniz:
$webServerCert = get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95
Bir sonraki adım, bağlayıcı oluşturmaktır.
New-WebBinding -Name sample.contoso.com -IPAddress * -Port 443 -Protocol "https"
"Https" nin büyük / küçük harfe duyarlı olduğunu belirtmek önemlidir. Bunun yerine "HTTPS" kullanırsanız, gerçekten farklı bir bağlama sonucu elde edersiniz.
Bu bağlamanın henüz ekli bir sertifikası yok, bu nedenle son adım sertifikayı eklemektir. Sertifika düzgün bir şekilde güvenilirse ve güvenlik doğruysa, bu adım başarılı olmalıdır. Yine de sertifika ile ilgili herhangi bir sorun varsa titiz olabilir.
$bind = Get-WebBinding -Name $webSiteDNSName -Protocol https
$bind.AddSslCertificate($webServerCert.GetCertHashString(), "my")
Oturum açma oturumu hakkında bir ileti yoksa bu başarısız olursa, sertifikada bazı sorunlar olabilir. Daha fazla ayrıntı için olay görüntüleyiciyi inceleyin. Çabalarım sırasında, güvenlik günlüğünde 5061 olayını buldum. Başarısız olduğunda, OpenKey'nin 80090016 (Anahtar Seti Var Değil) ile başarısız olduğunu gösterdi. Ve başarısızlık, SYSTEM'in özel anahtara erişememesiydi.
Bu, https bağlayıcısını oluşturmak için yeterliydi. Http bağlama, New-WebSite cmdlet'inin bir yan ürünüdür. Ücretsiz olarak gelmezse, 80 numaralı bağlantı noktasını New-WebBinding cmdlet'i ile bağlamayı bir zorluk olarak oluşturmayı bulamadım.