파워쉘을 사용한 IIS 인증서 요청 마스터하기

IIS 인증서 요청을 생성하는 방법을 배우려면 올바른 장소에 오셨습니다. 이 기사에서는 PowerShell을 사용하여 이 작업을 수행하는 방법과 인증서를 IIS 웹 사이트에 바인딩하는 방법에 대해 다룰 것입니다.

일단 한 가지 명확하게 말씀드리겠습니다. 저는 암호화와 인증서를 정말 싫어합니다. 제 경력 동안 몇 차례 “인증서 담당자”로 일해본 적이 있습니다. 그러나 이것은 시스템 관리자에게 또 다른 역할일 뿐입니다.

I never got to the point where I completely understood the technology and it seemed like every task I tried to accomplish around that area seemed to never work out. It’s definitely an unforgiving technology for sure.

PowerShell을 사용하여 IIS 서버에 인증서를 자동으로 설치하는 과정에 대해 이야기해 드리겠습니다.

미션

클라이언트로부터 새로운 공용 Digicert 인증서를 요청하고 작업 그룹에서 IIS 8.5가 실행되는 원격 Windows Server 2012 R2 Core Server에 인증서를 설치하고 웹 사이트에 SSL 바인딩을 설정하여 설치된 인증서를 사용하는 것입니다. 간단한 일, 맞죠? ㅋㅋㅋ

수행 방법

요약하면, 이 작업을 수행하기 위해 X단계가 필요합니다.

  1. IIS 인증서 서명 요청을 생성합니다. 인증서를 설치할 컴퓨터에서. 제 경우에는 WinRM 액세스만 가능했으므로 Invoke-Command를 사용하여 원격 서버에서 certreq.exe를 실행하고 CSR 내용을 로컬 파일로 전송했습니다.
  2. 공개 CA에 의해 CSR을 서명 받으십시오. (도움은 없습니다 – 보안에서 돌아온 예쁜 인증서를 작업했습니다). 제 경우에는 보안 팀이 원하는 인증서뿐만 아니라 중간 인증서를 포함한 .CER 파일로 구성된 P7B 컬렉션을 돌려줬습니다. 이를 작동시키기 위해 약간의 조정이 필요했습니다.
  3. 인증서 서명 요청을 완료하십시오. 인증서를 설치할 컴퓨터에서 이 작업을 수행하면 인증서가 인증서 저장소에 저장됩니다.
  4. 서버에 SSL IIS 웹 바인딩을 생성하십시오.
  5. 인증서를 웹 바인딩에 연결하십시오.

IIS 인증서 요청 생성

첫 번째 작업은 PowerShell IIS 스크립트를 원격 서버에서 실행하여 요청 파일을 수집하는 것입니다. 이를 위해 certreq.exe는 INF 파일을 입력으로 사용합니다. 이 파일은 인증서의 다양한 옵션에 사용됩니다. 자세한 내용은 생략하겠습니다. 이것은 내가 사용한 INF 파일의 사본입니다.

[Version]
Signature = "$Windows NT$"
[NewRequest]
Subject = "C=US,S=State,L=City,O=Company,OU=IT,CN=Name"
Exportable = TRUE
KeyLength = 2048
KeySpec = 1
KeyUsage = 0xa0
MachineKeySet = True
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
Silent = True
SMIME = False
RequestType = PKCS10

New-CertificateSigningRequest 함수에서 이를 매우 쉽게 사용자 정의할 수 있도록 만들었습니다. 사실, 나의 함수를 사용하면 CSR(요청 파일)을 생성하기 위해 임시로 필요한 파일이기 때문에 심지어 이 파일을 볼 필요도 없을 것입니다.

다음으로, 이 INF 파일을 원격 서버에 가져와서 다음과 같은 매개변수로 certreq.exe를 실행해야 합니다. 예시: certreq.exe -new "$InfFilePath" "$reqFilePath".

이렇게하면 원격 컴퓨터에서 CSR(요청 파일)를 생성합니다. 그런 다음이 파일을 보안 팀에 보내야합니다. 이렇게하면 로컬 머신 컨텍스트의 인증서 발급 요청에 개인 키와 공개 키가 모두 포함 된 인증서가 생성됩니다.

Certificate service request in the Windows MMC snapin

IIS 인증서 요청 완료

내 경우, 단일 CER 파일이 돌아왔습니다. 이 PowerShell IIS 스크립트에서이를 직접 로컬 머신 컨텍스트의 개인 저장소에 가져 오기위한 기능을 만들었습니다. 그러나 IIS에서이를 볼 수 없었습니다. 그 이유는 인증서에 개인 키도 포함되어야했기 때문입니다. 인증서를 간단히 개인 저장소에 가져 오는 것만으로는 작동하지 않았습니다. certreq.exe를 사용하여 인증서 요청을 완료해야했습니다.

이를 위해 보안 팀에서 받은 인증서를 원격 서버로 복사 한 다음 다음과 같이 certreq.exe를 실행해야합니다. certreq.exe -accept -machine "C:\issuedcert.cer".

응답 인증서가 항상 로컬 머신 컨텍스트로 이동하도록하기 위해 -machine 매개 변수를 사용해야합니다. 이렇게하면 성공적으로 완료되어야하지만 실제로는 그렇지 않았습니다. 어떤 이유에서인지, 다음과 같은 오류가 발생했습니다:

Error requesting certificate

이는 요청 파일의 공개 키가 보안 팀에서 반환 한 것과 일치하지 않음을 의미합니다. 이를 테스트하기 위해 간단히 certutil.exe -dump requestfile.reqcertutil -dumpissuedcert.cer을 실행하십시오. 출력에서 공개 키 영역을 찾을 때까지 아래로 스크롤하십시오.

Encrypted public key

각 개인 키를 복사하여 텍스트 편집기에서 비교하여 동일한지 확인하십시오. 그렇지 않으면 보안 팀에 연락하여 요청을 올바르게 서명하지 않았음을 알리세요!

일치하는 경우 문제가 없으며 해당 오류를 받지 않아야합니다.

SSL 바인딩을 생성하십시오.

원격 서버에서 다음을 실행하십시오:

PS> Import-Module WebAdministration
PS> New-WebBinding -Name $WebsiteName -IP * -Port 443 -Protocol https

인증서를 SSL 바인딩에 첨부하십시오.

원격 서버에서 다음을 실행하십시오:

PS> $certificate = Get-Item Cert:\localmachine\My\$Thumbprint
PS> $certificate | New-Item "IIS:\SSLBindings\0.0.0.0!443"

PowerShell IIS 스크립트를 가져옵니다.

모든 것이 잘 되면 완료되었습니다! 이 작업을 수행하는 데 도움이 필요한 경우 세 가지 기능을 만들어 더 쉽게 수행할 수 있도록 하였습니다. 함수를 얻으려면 내 Github 저장소로 이동하십시오:

https://github.com/adbertram/Random-PowerShell-Work/tree/master/Certificates

https://github.com/adbertram/Random-PowerShell-Work/tree/master/IIS

예제 코드

## 이 출력물을 인증서 담당자에게 보내십시오 
New-CertificateSigningRequest -SubjectHost 'somesubject' -FilePath 'C:\somefile.req' -ComputerName REMOTESERVER

## 수신된 인증서 가져오기
Import-CertificateSigningRequestResponse -FilePath C:\issuedcert.cer -ComputerName REMOTESERVER

## 바인딩 생성 및 인증서 첨부.
New-IISWebBinding -ComputerName 'zapp09rpr01' -WebsiteName GHI -Protocol https -Port 443 -Certificate $cert

관련 독서

PowerShell을 사용하여 IIS 관리에 대한 ATA 블로그 글을 확인하십시오.

Source:
https://adamtheautomator.com/iis-certificate-request/