Tôi đã trải qua quá trình cố gắng thêm một ràng buộc https vào một trang web và nó có thể khá đau đớn. Có rất nhiều cách để hoàn thành từng bước và mỗi người đều có những cạm bẫy. Tôi đang để lại đằng sau giải pháp cuối cùng với hy vọng ai đó sẽ thấy nó hữu ích.
Giải pháp này giả định rằng bạn đã cài đặt IIS và một trang web được xác định. Gọi trang web sample.contoso.com cho mục đích của bài viết này. Giả sử rằng bạn có một chứng chỉ trong tệp sample.contoso.com.pfx mà bạn muốn sử dụng.
Bước đầu tiên là nhập chứng chỉ từ tệp.
$certPwd = ConvertTo-SecureString -String "password" -Force -AsPlainText
$webServerCert = Import-PfxCertificate -FilePath c:\some\folder\sample.contoso.com.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $certPwd
Sẽ thật tốt nếu điều đó là đủ. Và trong một số trường hợp nó có thể. Tuy nhiên, đối với tôi, điều này khiến chứng chỉ không có quyền truy cập vào khóa riêng. Điều này gây ra lỗi powershell "Một phiên đăng nhập được chỉ định không tồn tại. Nó có thể đã bị chấm dứt" khi tôi đi thêm chứng chỉ vào liên kết (xem bước sau). Vì vậy, bước tiếp theo là sửa lỗi ACL cho khóa riêng.
$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
Điều này sẽ cho phép hệ thống cục bộ có quyền truy cập đầy đủ vào khóa riêng nếu điều đó không được kế thừa từ thư mục chứa.
Nếu bạn muốn nhận một chứng chỉ đã được cài đặt, bạn cần hàm băm cho nó và có thể lấy nó với Get-Item như vậy:
$webServerCert = get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95
Bước tiếp theo là tạo ra sự ràng buộc.
New-WebBinding -Name sample.contoso.com -IPAddress * -Port 443 -Protocol "https"
Điều quan trọng cần lưu ý là "https" phân biệt chữ hoa chữ thường. Nếu bạn sử dụng "HTTPS" thay vào đó, bạn sẽ nhận được một kết quả ràng buộc thực sự khác biệt.
Ràng buộc này chưa có chứng chỉ kèm theo, vì vậy bước cuối cùng là đính kèm chứng chỉ. Nếu chứng chỉ được tin cậy đúng cách và bảo mật là chính xác, bước này sẽ thành công. Nó có thể là khó khăn nếu có bất kỳ vấn đề với giấy chứng nhận mặc dù.
$bind = Get-WebBinding -Name $webSiteDNSName -Protocol https
$bind.AddSslCertificate($webServerCert.GetCertHashString(), "my")
Nếu điều này không thành công với một thông báo về phiên đăng nhập không tồn tại, thì chứng chỉ có thể có một số vấn đề. Xem lại người xem sự kiện để biết thêm chi tiết. Trong những nỗ lực của tôi, tôi đã tìm thấy sự kiện 5061 trong nhật ký bảo mật. Khi thất bại, nó cho thấy OpenKey đã thất bại với 80090016 (Bộ khóa không tồn tại). Và thất bại là vì HỆ THỐNG không có quyền truy cập vào khóa riêng.
Điều đó là đủ để tôi tạo liên kết https. Liên kết http là sản phẩm phụ của việc sử dụng lệnh ghép ngắn New-WebSite. Nếu nó không miễn phí, tôi đã không thấy việc tạo cổng 80 ràng buộc với lệnh ghép ngắn New-WebBinding là một thách thức.