В моей среде мы размещаем множество веб-сайтов и веб-сервисов WCF в IIS (в Windows 2008 R2 и Windows 2012).
Мы находимся в процессе включения HTTPS на этих сайтах. Это выглядит следующим образом:
*.environment.domain
сертификат в IIS, используя центр сертификации Active Directory, который доступен в нашей сети.Учитывая количество машин и сайтов, мы хотим автоматизировать необходимые действия. Я могу применить правильные привязки сайтов к сайтам во время развертывания, но я еще не нашел решения для создания и установки сертификата, подписанного доменом, в IIS.
Я уже узнал, как это сделать вручную, используя значок «Сертификаты сервера» в IIS и вызывая там действие «Создать сертификат домена». Я могу предоставить правильные учетные данные, и когда я укажу центр сертификации, я могу создать желаемые сертификаты.
Я также обнаружил, что вы можете просмотреть, какие сертификаты установлены на машине, используя cert:\
Диск PowerShell:
cert:\LocalMachine\My> Get-ChildItem
И я обнаружил, что в Windows Server 2012 есть New-SelfSignedCertificate
PowerShell CmdLet доступен.
Однако я не могу найти требуемых коммандос PowerShell для объединения всех этих действий на Windwos Server 2008 R2.
Как создать и установить SSL-сертификат, подписанный доменом, в IIS с помощью PowerShell?
Попробуйте следующее:
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 (я не уверен, что они существуют, и если они есть, то их обычно нет в старых ОС).
Детали запроса находятся в строке здесь, при необходимости исправьте тему и другие параметры. Вы можете переместить больше значений в раздел параметров.
Я создаю файл inf для нового запроса и конвертирую его в файл запроса.
Затем я отправляю запрос в ЦС, указанный в $ CAName, если выполняющий пользователь является администратором домена, запрос отправляется сразу.
Наконец, я завершаю запрос с помощью -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