使用 PowerShell 管理 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服务器中,设置一个SSL绑定到一个网站,并使用安装的证书进行绑定。简单吧?哈哈哈!

操作方法

简而言之,这需要X个步骤才能完成。

  1. 在将证书安装的计算机上生成一个IIS证书签名请求。在我的情况下,我只有WinRM访问权限,所以我必须使用Invoke-Command在远程服务器上执行certreq.exe并将CSR的内容发送到本地文件中。
  2. 將CSR送交公開的CA以獲得簽署(此處不提供幫助-與我合作的安全團隊剛剛返回了一個漂亮的證書)。在我的情況下,安全團隊將一組證書捲成一個.CER文件並交還給我,其中包括我正在尋找的證書以及中介證書。這需要一些調整才能正常運作。
  3. 在將證書安裝的電腦上完成證書簽署請求。這將使證書進入證書存儲庫。
  4. 在服務器上創建SSL IIS網絡綁定
  5. 將證書附加到網絡綁定

生成IIS證書請求

首先,您需要在遠程服務器上運行此PowerShell IIS腳本的任務是使用certreq.exe收集請求文件。為此,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/