![如何使用 PowerShell 在 IIS 中创建和安装域签名证书?](https://linux22.com/image/652501/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20PowerShell%20%E5%9C%A8%20IIS%20%E4%B8%AD%E5%88%9B%E5%BB%BA%E5%92%8C%E5%AE%89%E8%A3%85%E5%9F%9F%E7%AD%BE%E5%90%8D%E8%AF%81%E4%B9%A6%EF%BC%9F.png)
在我的环境中,我们在 IIS(在 Windows 2008 R2 和 Windows 2012 上)中托管大量网站和 WCF Web 服务。
我们正在为这些网站启用 HTTPS。具体步骤如下:
*.environment.domain
使用我们网络中可用的 Active Directory 证书颁发机构,在 IIS 中创建域签名证书。- 通过更改站点绑定并应用生成的证书在站点上启用 HTTPS。
考虑到机器和站点的数量,我们希望自动执行所需的操作。我可以在部署期间将正确的站点绑定应用于站点,但我尚未找到在 IIS 中创建和安装域签名证书的解决方案。
我已经找到了如何手动执行此操作的方法,使用 IIS 中的“服务器证书”图标,并在那里调用“创建域证书”操作。我可以提供正确的凭据,并且当我指定证书颁发机构时,我可以创建所需的证书。
我还发现您可以使用 PowerShell 驱动器查看机器中安装了哪些证书cert:\
:
cert:\LocalMachine\My> Get-ChildItem
我发现 Windows Server 2012 上有一个New-SelfSignedCertificate
可用的 PowerShell CmdLet。
但是,我似乎无法找到在 Windwos Server 2008 R2 上组合所有这些操作所需的 PowerShell 命令。
如何使用 PowerShell 在 IIS 中创建和安装域签名的 SSL 证书?
答案1
请尝试以下操作:
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