Thêm một liên kết đến một trang web IIS bằng powershell


19

Tôi đang cố gắng kiểm soát các ràng buộc trong một ứng dụng IIS bằng powershell. Tôi muốn tạo một trang web có cả ràng buộc http và https bằng cách sử dụng tập lệnh.

Đây là những gì tôi có cho đến nay:

Param(
    [Parameter(Mandatory=$True,Position=1)]
    [string]$hostname,
    [Parameter(Mandatory=$True,Position=2)]
    [string]$installPath,
    [Parameter(Mandatory=$False,Position=3)]
    [string]$ip
)

Import-Module WebAdministration

$appPoolName =  $hostname + 'Pool'

$port = 80
$hostRecord = $hostname+'.example.com'

$bindings = @{protocol="http";bindingInformation=$ip + ":"+ $port + ":" + $hostRecord}

New-Item IIS:\AppPools\$appPoolName
Set-ItemProperty IIS:\AppPools\$appPoolName managedRuntimeVersion v4.0

New-Item IIS:\Sites\$hostname -Bindings $bindings -PhysicalPath $installPath
Set-ItemProperty IIS:\Sites\$hostname -Name applicationPool -Value $appPoolName

Làm cách nào để thêm các ràng buộc vào $bindingsbiến của tôi / sử dụng một số cơ chế khác để đạt được mục tiêu của tôi?

Câu trả lời:


24

Bạn có thể sử dụng New-WebBinding: http://technet.microsoft.com/en-us/l Library / eee790567.aspx

ví dụ

IIS:\>New-WebBinding -Name "Default Web Site" -IPAddress "*" -Port 80 -HostHeader TestSite

Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Mark Henderson

Bạn có nghĩ rằng tôi sẽ đưa ra một ví dụ tốt hơn ở cuối bài viết về kỹ thuật không?
MatthewP

15
Không, nhưng có lẽ bạn nên lấy một phần của bài báo kỹ thuật có liên quan và sao chép nó ở đây trong một khối trích dẫn. Tôi đã chỉnh sửa trong một cái gì đó là đủ.
Mark Henderson

Điều này có yêu cầu khởi động lại IIS để có hiệu lực không?
Krunal

10

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.


1
Tôi đánh giá cao câu trả lời này, nhưng dường như có một lộ trình dễ dàng hơn @ stackoverflow.com/questions/32390097/iêu .
Peter Majeed

1
Tôi đồng ý rằng lệnh gọi AddSslCertert dễ chịu hơn cú pháp mục mới và tôi đã thay thế nó. Sự thất vọng tôi gặp phải khi làm việc này là các thông báo lỗi tôi nhận được và thực tế là tôi không thể liên hệ chúng lại với độ phân giải bằng tìm kiếm google. Vì vậy, những từ còn lại có liên quan đến việc nới lỏng quá trình đó trong tương lai hoặc cho người khác.
Giáo sư Von Lemongargle

4

Tôi nghĩ những gì bạn đang theo đuổi là như sau:

$bindings = @(
   @{protocol="http";bindingInformation=$ip + ":"+ $port + ":" + $hostRecord},
   @{protocol="https";bindingInformation=$ip + ":"+ $port + ":" + $hostRecord}
)

Về cơ bản, bạn cần phải vượt qua một loạt các ràng buộc. Thông tin hữu ích khác ở đây - ( http://bloss.iis.net/jeonghwan/iis-powershell-user-guide-compared-interesentative-iis-ui-t task )

(Chỉnh sửa: Đã sửa lỗi chính tả trong cú pháp mảng - dấu phẩy không liên quan)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.