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