powershell을 사용하여 IIS 사이트에 바인딩 추가


19

powershell을 사용하여 IIS 앱에서 바인딩을 제어하려고합니다. 스크립트를 사용하여 http 및 https 바인딩을 모두 사용하여 사이트를 만들고 싶습니다.

이것이 내가 지금까지 한 것입니다.

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

$bindings변수 에 바인딩을 추가 하고 목표를 달성하기 위해 다른 메커니즘을 어떻게 사용합니까?

답변:


24

New-WebBinding을 사용할 수 있습니다 : http://technet.microsoft.com/en-us/library/ee790567.aspx

예 :

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

이 이론적으로 질문에 대답 할 수 있습니다 동안, 바람직 할 것이다 여기에 대한 대답의 본질적인 부분을 포함하고 참조 할 수 있도록 링크를 제공합니다.
— Mark Henderson

당신은 내가 technet 기사의 맨 아래에서보다 더 나은 예를 생각 해낼 것이라고 생각합니까?
— MatthewP

15
아니요, 그러나 관련 기술 문서의 일부를 인용 블록으로 여기에 재현해야합니다. 충분한 것으로 편집했습니다.
— Mark Henderson

적용하려면 IIS를 다시 시작해야합니까?
— Krunal

10

사이트에 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이 발견되었습니다. 실패하면 80090016 (키셋이 존재하지 않음)으로 OpenKey가 실패했음을 나타냅니다. 그리고 SYSTEM이 개인 키에 액세스 할 수 없었기 때문에 실패했습니다.

그것은 https 바인딩을 만들기에 충분했습니다. http 바인딩은 New-WebSite cmdlet 사용의 부산물이었습니다. 무료로 제공되지 않으면 New-WebBinding cmdlet을 사용하여 포트 80 바인딩을 만드는 것이 쉽지 않습니다.


1
이 답변에 감사 드리지만 @ stackoverflow.com/questions/32390097/… 더 쉬운 경로가있는 것 같습니다 .
— 피터 마 제드

1
AddSslCertificate 호출이 새 항목 구문보다 더 만족스럽고 교체했습니다. 이 작업을 수행 할 때의 좌절은 내가 얻은 오류 메시지와 Google 검색을 사용하여 다시 해상도와 관련시킬 수 없다는 사실이었습니다. 따라서 나머지 단어는 향후 또는 다른 사람을 위해 해당 프로세스를 완화하는 것과 관련이 있습니다.
— Von Lemongargle 교수님

4

나는 당신이 겪고있는 것이 다음과 같다고 생각합니다.

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

기본적으로 일련의 바인딩을 전달해야합니다. 더 유용한 정보는 여기-( http://blogs.iis.net/jeonghwan/iis-powershell-user-guide-comparing-representative-iis-ui-tasks )

(편집 : 배열 구문의 오타 수정-불필요한 쉼표)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.