如何使用 PowerShell 在 IIS 中創建和安裝域簽名證書?
在我的環境中,我們在 IIS 中託管了大量網站和 WCF Web 服務(在 Windows 2008 R2 和 Windows 2012 上)。
我們正在這些網站上啟用 HTTPS。這如下:
*.environment.domain
使用我們網路中可用的 Active Directory 證書頒發機構在 IIS 中創建域簽名證書。- 通過更改站點綁定並應用生成的證書,在站點上啟用 HTTPS。
鑑於機器和站點的數量,我們希望自動執行所需的操作。我可以在部署期間將正確的站點綁定應用到站點,但是我還沒有找到在 IIS 中創建和安裝域簽名證書的解決方案。
我已經找到瞭如何手動執行此操作,使用 IIS 中的“伺服器證書”圖示,並在那裡呼叫“創建域證書”操作。我可以提供正確的憑據,當我指定證書頒發機構時,我可以創建所需的證書。
我還發現您可以使用
cert:\
PowerShell 驅動器查看機器中安裝了哪些證書:cert:\LocalMachine\My> Get-ChildItem
而且我發現在 Windows Server 2012 上有一個
New-SelfSignedCertificate
PowerShell CmdLet 可用。但是,我似乎找不到在 Windwos Server 2008 R2 上組合所有這些操作所需的 PowerShell 突擊隊。
如何使用 PowerShell 在 IIS 中創建和安裝域簽名 SSL 證書?
嘗試以下操作:
function New-DomainSignedCertificate { [CmdletBinding()] param( [parameter(Mandatory=$true)] [string] $Hostname, [parameter(Mandatory=$true)] [string] $Organization, [parameter(Mandatory=$true)] [string] $OrganizationalUnit, [parameter(Mandatory=$true)] [string] $Locality, [parameter(Mandatory=$true)] [string] $State, [parameter(Mandatory=$true)] [string] $Country, [parameter(Mandatory=$true)] [string] $CertificateAuthority, [parameter(Mandatory=$false)] [string] $Keylength = "2048", [string] $workdir = $env:Temp ) $fileBaseName = $Hostname -replace "\.", "_" $fileBaseName = $fileBaseName -replace "\*", "" $infFile = $workdir + "\" + $fileBaseName + ".inf" $requestFile = $workdir + "\" + $fileBaseName + ".req" $CertFileOut = $workdir + "\" + $fileBaseName + ".cer" Try { Write-Verbose "Creating the certificate request information file ..." $inf = @" [Version] Signature="`$Windows NT`$" [NewRequest] Subject = "CN=$Hostname, OU=$OrganizationalUnit, O=$Organization, L=$Locality, S=$State, C=$Country" KeySpec = 1 KeyLength = $Keylength Exportable = TRUE FriendlyName = "$Hostname" MachineKeySet = TRUE SMIME = False PrivateKeyArchive = FALSE UserProtected = FALSE UseExistingKeySet = FALSE ProviderName = "Microsoft RSA SChannel Cryptographic Provider" ProviderType = 12 RequestType = PKCS10 KeyUsage = 0xa0 [Extensions] 2.5.29.17 = "{text}" _continue_ = "dns=$Hostname&" "@ $inf | Set-Content -Path $infFile Write-Verbose "Creating the certificate request ..." & certreq.exe -new "$infFile" "$requestFile" Write-Verbose "Submitting the certificate request to the certificate authority ..." & certreq.exe -submit -config "$CertificateAuthority" -attrib "CertificateTemplate:WebServer" "$requestFile" "$CertFileOut" if (Test-Path "$CertFileOut") { Write-Verbose "Installing the generated certificate ..." & certreq.exe -accept "$CertFileOut" } } Finally { Get-ChildItem "$workdir\$fileBaseName.*" | remove-item } }
它基本上只使用 certreg.exe 而不是本機 PowerShell cmdlet,(我不確定它們是否存在,如果存在,通常在較舊的作業系統上不存在)。
請求詳細資訊在此處的字元串中,如果需要,請修復主題和其他設置。您可能希望將更多值向上移動到參數部分。
我為新請求創建了一個 inf 文件並將其轉換為請求文件。
然後我將請求送出給 $CAName 中指定的 CA,如果執行使用者是域管理員,則立即發出請求。
最後,我使用 -accept 完成請求並進行一些清理。
我通常還將新證書導出到 PFX 文件中。
對於 IIS 綁定和證書分配,您可以使用如下內容:
New-WebBinding -Name www.test.local -Port 443 -Protocol https $thumb = (Get-ChildItem cert:\LocalMachine\MY | where-object { $_.FriendlyName -like "www.test.local" } | Select-Object -First 1).Thumbprint $guid = [guid]::NewGuid() & netsh http add sslcert hostnameport=www.test.local:443 certhash=$thumb appid=`{$guid`} certstorename=MY