IIS: Управление несколькими сертификатами на нескольких веб-серверах

Управление сертификатами в крупномасштабных веб-средах — крупномасштабная неувязка. У вас могут быть сотки серверов, служащих хостами для сотен сайтов с поддержкой SSL, имеющих уникальные сертификаты. Если вы используете GUI IIS Manager, установка и сервис сертификатов в таком масштабе отнимет кучу времени.

Не страшитесь — имеется наилучший подход. Независимо от того, сколько у вас веб-серверов — два либо 200, Windows PowerShell превратит деньки, недели либо месяцы потраченного вами времени в пару минут. В процессе развертывания, установки и опции сертификатов и SSL ваших сайтов, можно применить несколько приемов, которые позволят отыскать сертификаты, которые скоро устареют, и поменять их.

Принципы ординарны. Это работает в IIS 7.5 и IIS 8, но нужно использовать удаленный доступ через Windows PowerShell. В нашем примере будет два веб-сервера, работающих в конфигурации с балансированием нагрузки, и имеющих свои собственные Айпишника кластера. На каждом сервере работает три сайта, которым необходимы SSL-сертификаты и привязки. Я изменил Айпишники кластера на внутренние, чтоб скрыть истинные сайты, но мысль должна быть вам понятна. Я заполучил сертификаты, и имею .pfx-файлы, готовые к развертыванию. Вот перечень моих сайтов:

Shop.Company.com — Айпишник 192.168.3.201 — Сертификат: shop.company.com.pfx
Update.Company.com — Айпишник 192.168.3.202 — Сертификат: update.company.com.pfx
Register.Company.com — Айпишник 192.168.3.203 — Сертификат: register.company.com.pfx

Давайте приступим к развертыванию и установке сертификатов на веб-серверах с балансированием нагрузки.

Развертывание и установка

Для начала нам необходимы две вещи — переменная, содержащая перечень имен компов, являющихся веб-серверами, и удаленный сеанс соединения с каждым из этих серверов через Windows PowerShell. Имена компов берутся из текстового файла с моего компьютера, но можно брать их и из Active Directory, если веб-серверы являются членами домена:

PS> $servers = Get-Content c:webservers.txt
PS> $session = New-PsSession –ComputerName $servers

Скопируйте сертификаты на удаленные серверы, чтоб можно было без труда установить их. Не опасайтесь, что кто-то украдет ваши .pfx-файлы. Вы удалите их в процессе выполнения операций, обрисованных в этом разделе. В нашем примере .pfx-файлы находятся на моем клиентском компьютере в каталоге c:sitescertpfx:

PS> $servers | foreach-Object{
copy-item -Path c:sitescertpfx*.* -Destination «\$_c$»}

CertUtil.exe — хорошее средство установки сертификатов из сеансов удаленного доступа через Windows PowerShell. В последующих однострочных командах осуществляется установка сертификатов на каждый веб-сервер. Нам необходимо установить три сертификата (по одному для каждого сайта), потому команда повторяется:

PS> Invoke-command -Session $session {
certutil -p P@ssw0rd -importpfx c:shop.company.com.pfx}
PS> Invoke-command -Session $session {
certutil -p P@ssw0rd -importpfx c:update.company.com.pfx}
PS> Invoke-command -Session $session {
certutil -p P@ssw0rd -importpfx c:register.company.com.pfx}

При использовании CertUtil.exe будет нужно указать пароли для .pfx. Так как я выполняю команды в реальном времени, я просто набираю пароли. Если вы собираетесь написать сценарий, я бы рекомендовал поменять пароли переменной для ввода пароля из приглашения, к примеру:

PS> $Cred = (Get-Credential).password

Не забудьте удалить .pfx-файлы с удаленных веб-серверов, чтоб предупредить возможное похищение сертификатов:

PS> $servers | foreach-object {Remove-Item -Path «\$_c$*.pfx»}

Последующий шаг после установки сертификатов на удаленные серверы — создание HTTPS-привязок для сайтов.

Создание привязок сайтов

Каждый сайт на каждом сервере в конфигурации с балансированием нагрузки обязан иметь HTTPS-привязку. Воспользуйтесь командлетом New-WebBinding из модуля WebAdministration, и все будет проще обычного. В параметрах командлета указывают имя веб-сайта, протокол, порт и Айпишник кластера для веб-сайта. Параметр SSLFlags определяет местопребывание сертификата, который будет употребляться при привязке:

PS> Invoke-Command -session $session {Import-Module WebAdministration}
PS> Invoke-command -Session $session {
New-WebBinding -name shop -Protocol https -Port 443 -IPAddress 192.168.3.201 -SslFlags 0}
PS> Invoke-command -Session $session {
New-WebBinding -name update -Protocol https -Port 443 -IPAddress 192.168.3.202 -SslFlags 0}
PS> Invoke-command -Session $session {
New-WebBinding -name register -Protocol https -Port 443 -IPAddress 192.168.3.203 -SslFlags 0}

Мы только-только установили сертификаты в хранилище сертификатов Windows. В нашем распоряжении были последующие варианты:

0 — обыденный сертификат в хранилище сертификатов Windows;
1 — сертификат Server Name Indication (SNI);
2 — централизованное хранилище сертификатов;
3 — SNI-сертификат в централизованном хранилище сертификатов.

Остался последний шаг, который нередко упускают из виду и запамятывают: связывание сертификатов с новыми привязками сайтов.

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

На этом последнем шаге вероятна неурядица. Графический IIS Manager прячет эту часть процесса, но мы не можем от нее отрешиться, если желаем, чтоб наши веб-сайты работали с SSL. Мы должны связать сертификаты с привязками сайтов.

Это двухэтапный процесс. Во-1-х, нужно получить отпечаток (thumbprint) сертификата каждого сайта, чтоб можно было сделать подобающую SSL-привязку. Вспомните: в нашем примере обслуживаются три сайта. Мне нужен отпечаток каждого уникального сертификата. Я решил хранить отпечатки в 3-х разных переменных, чтоб не запутаться при их связывании с сайтами:

PS> Invoke-Command -session $session {
$CertShop=Get-ChildItem -Path Cert:LocalMachineMy |
where-Object {$_.subject -like «*shop*»} |
Select-Object -ExpandProperty Thumbprint}
PS> Invoke-Command -session $session {
$CertUpdate=Get-ChildItem -Path Cert:LocalMachineMy |
where-Object {$_.subject -like «*update*»} |
Select-Object -ExpandProperty Thumbprint}
PS> Invoke-Command -session $session {
$CertRegister=Get-ChildItem -Path Cert:LocalMachineMy |
where-Object {$_.subject -like «*register*»} |
Select-Object -ExpandProperty Thumbprint}

Сейчас пора получить по отпечаткам сами сертификаты и указать их в SSL-привязках для каждого сайта. Последующая команда употребляет Get-Item для получения сертификата, а потом New-Item для сотворения SSL-привязки; IIS-провайдер IIS:SSLBindings делает SSL-привязки совместно с информацией о связывании:

PS> Invoke-Command -Session $session {
get-item -Path «cert:localmachinemy$certShop» |
new-item -path IIS:SslBindings192.168.3.201!443}
PS> Invoke-Command -Session $session {
get-item -Path «cert:localmachinemy$certUpdate» |
new-item -path IIS:SslBindings192.168.3.202!443}
PS> Invoke-Command -Session $session {
get-item -Path «cert:localmachinemy$certRegister» |
new-item -path IIS:SslBindings192.168.3.203!443}

В IIS информация о связывании обычно показывается как Айпишник:порт:имя хоста (*:80:*). Но Windows PowerShell интерпретирует двоеточие (:) как признак пути. Потому при использовании Windows PowerShell для задания инфы о связывании заместо двоеточия употребляют восклицательный символ (!).

Сейчас привязки сформированы, и можно обратиться к сайтам по протоколу HTTPS:

PS> start iexplore https://shop.company.com
PS> start iexplore https://update.company.com
PS> start iexplore https://register.company.com

Проверка истечения

Имеется очередное полезное решение, основанное на только-только усвоенной вами инфы. Для многих из вас это обычная производственная неувязка: не устареют ли скоро ваши сертификаты?

При управлении сертификатами приходится определять, не подходит ли к концу срок деяния неких из их и не пора ли их поменять. К этой задачке применимы принципы и приемы, которые я обрисовал выше. Но одной строчкой тут не обойдешься. И опять необходимо открыть сеанс удаленного доступа через Windows PowerShell к веб-серверам, на которых вы собираетесь инспектировать срок деяния сертификатов.

В последующем примере сканируются все сертификаты в хранилище сертификатов локального компьютера. Команда ассоциирует свойство notafter, содержащее дату истечения сертификата, с текущей датой, и выводит итог в свой столбец, нареченный мной ExpireInDays. Фильтр (Where-Object) служит для отбора сертификатов, до истечения которых осталось наименее 90 дней. Команда выводит имена серверов и сертификаты, которые скоро устареют:

PS> Invoke-Command -Session $session {
Get-ChildItem -Path Cert:LocalMachineMy |
Select-Object -Property PSComputerName, Subject, @{
n=’ExpireInDays’;e={($_.notafter – (Get-Date)).Days}} |
Where-Object {$_.ExpireInDays -lt 90}}

Используя усвоенные сейчас познания, вы можете стремительно и удачно поменять все такие сертификаты при помощи Windows PowerShell, даже в крупномасштабных конфигурациях.

Аналогичный товар: Комментирование на данный момент запрещено, но Вы можете оставить ссылку на Ваш сайт.

Комментарии закрыты.