Овладение запросами сертификатов IIS с помощью PowerShell

Если вы хотите узнать, как создать запрос на сертификат IIS, вы пришли по адресу. В этой статье я расскажу, как я сделал это с помощью PowerShell, а также как привязать сертификат к веб-сайту IIS.

Давайте разберемся в одном важном вопросе. Я ненавижу криптографию и сертификаты. За время своей карьеры я был “парнем по сертификатам” несколько раз. Тем не менее, это была просто еще одна роль для системного администратора.

I never got to the point where I completely understood the technology and it seemed like every task I tried to accomplish around that area seemed to never work out. It’s definitely an unforgiving technology for sure.

Позвольте мне рассказать вам историю об автоматизации установки сертификата на сервере IIS с использованием PowerShell.

Миссия

От клиента поступила просьба о предоставлении нового общедоступного сертификата Digicert, его установке на удаленном сервере Windows Server 2012 R2 Core с IIS 8.5 в рабочей группе, установке SSL-привязки к веб-сайту и использовании установленного сертификата для привязки. Просто, верно? ЛОЛ!

Как это делается, сын!

Вкратце, для этого потребуется X шагов.

  1. Создайте запрос на сертификат IIS на компьютере, где будет установлен сертификат. В моем случае у меня был доступ только через WinRM, поэтому мне пришлось выполнить certreq.exe на удаленном сервере с использованием Invoke-Command и отправить содержимое CSR в локальный файл.
  2. Получите CSR, подписанный общедоступным Центром сертификации. (Здесь нет помощи – красивый сертификат только что вернулся от службы безопасности, с которой я работал). В моем случае команда безопасности предоставила мне набор сертификатов P7B, объединенных в файл .CER, который включал искомый мной сертификат, а также промежуточные сертификаты. Это потребовало некоторой настройки, чтобы заработать.
  3. Завершите запрос на подпись сертификата на компьютере, где будет установлен сертификат. Это поможет добавить сертификат в хранилище сертификатов.
  4. Создайте привязку SSL IIS на сервере.
  5. Присоедините сертификат к этой привязке.

Генерация запроса на сертификат IIS

Ваше первое задание – запустить certreq.exe с этим сценарием PowerShell IIS на удаленном сервере, чтобы собрать файл запроса. Для этого certreq.exe требуется файл INF в качестве входных данных. Этот файл используется для всех различных параметров, которые у вас будут у сертификата. Не вдаваясь в подробности, это копия файла INF, который я использовал.

[Version]
Signature = "$Windows NT$"
[NewRequest]
Subject = "C=US,S=State,L=City,O=Company,OU=IT,CN=Name"
Exportable = TRUE
KeyLength = 2048
KeySpec = 1
KeyUsage = 0xa0
MachineKeySet = True
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
Silent = True
SMIME = False
RequestType = PKCS10

В функции New-CertificateSigningRequest вы увидите, что я делаю настройку этого очень простой. Фактически, если вы используете мои функции, вы даже не увидите этот файл, так как он нужен только временно для создания CSR (файла запроса).

Затем вам нужно передать этот файл INF на удаленный сервер и выполнить certreq.exe с параметрами, подобными certreq.exe -new "$InfFilePath" "$reqFilePath".

Это создаст CSR (файл запроса) на удаленном компьютере. Затем вам нужно отправить этот файл своей службе безопасности. Это также создаст сертификат, содержащий как закрытый, так и открытый ключи, в Запросах на выдачу сертификата в контексте локальной машины.

Certificate service request in the Windows MMC snapin

Завершение запроса сертификата IIS

В моем случае я получил один файл CER. Я создал функцию в этом сценарии PowerShell IIS, чтобы просто импортировать его непосредственно в хранилище Личных данных в контексте локальной машины, чтобы обнаружить, что IIS не мог его увидеть. Причина заключалась в том, что сертификат также должен был содержать закрытый ключ. Простое импортирование сертификата в хранилище Личных данных не сработало. Мне пришлось завершить запрос сертификата, используя certreq.exe.

Для этого вам нужно скопировать сертификат, который вы получите от вашей службы безопасности, на удаленный сервер, а затем выполнить certreq.exe таким образом certreq.exe -accept -machine "C:\issuedcert.cer".

Всегда убедитесь, что ответный сертификат всегда помещается в контекст локальной машины с помощью параметра -machine. Это должно успешно завершиться согласно всему, что я прочитал, но определенно не у меня. По какой-то причине я получал ошибку, которая выглядела примерно так:

Error requesting certificate

Оказалось, что это означает, что открытый ключ в файле запроса не совпадает с тем, что вернула служба безопасности. Чтобы проверить это, просто запустите certutil.exe -dump requestfile.req и certutil -dumpissuedcert.cer. Прокрутите вниз вывод, пока не увидите область открытого ключа.

Encrypted public key

Скопируйте каждый из этих закрытых ключей и сравните их в текстовом редакторе, чтобы убедиться, что они одинаковы. Если нет, обратитесь к вашей службе безопасности за тем, что они неправильно подписали ваш запрос!

Если они совпадают, вы в порядке, и вы не должны получать эту ошибку.

Создайте привязку SSL

На удаленном сервере выполните:

PS> Import-Module WebAdministration
PS> New-WebBinding -Name $WebsiteName -IP * -Port 443 -Protocol https

Прикрепите сертификат к привязке SSL

На удаленном сервере выполните:

PS> $certificate = Get-Item Cert:\localmachine\My\$Thumbprint
PS> $certificate | New-Item "IIS:\SSLBindings\0.0.0.0!443"

Получите сценарий PowerShell для IIS

Если все идет хорошо, вы закончили! Теперь, если вам нужна небольшая помощь в этом, я создал три функции, чтобы сделать это намного проще. Загляните в мой репозиторий на Github, чтобы получить функции:

https://github.com/adbertram/Random-PowerShell-Work/tree/master/Certificates

https://github.com/adbertram/Random-PowerShell-Work/tree/master/IIS

Пример кода

## Отправьте файл, который это выводит, вашим специалистам по сертификатам
New-CertificateSigningRequest -SubjectHost 'somesubject' -FilePath 'C:\somefile.req' -ComputerName REMOTESERVER

## Импортируйте полученный сертификат
Import-CertificateSigningRequestResponse -FilePath C:\issuedcert.cer -ComputerName REMOTESERVER

## Создайте привязку и прикрепите сертификат.
New-IISWebBinding -ComputerName 'zapp09rpr01' -WebsiteName GHI -Protocol https -Port 443 -Certificate $cert

Связанные материалы

Обязательно посмотрите другие записи блога ATA по управлению IIS с использованием PowerShell

Source:
https://adamtheautomator.com/iis-certificate-request/