Назад | Перейти на главную страницу

Как я могу создать и установить сертификат, подписанный доменом, в IIS с помощью PowerShell?

В моей среде мы размещаем множество веб-сайтов и веб-сервисов WCF в IIS (в Windows 2008 R2 и Windows 2012).

Мы находимся в процессе включения 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?

Попробуйте следующее:

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