none
WMSvc и SSL: смена сертификата приводит к невозможности запуска службы WMSvc RRS feed

  • Вопрос

  • Коллеги, наткнулся на неприятную особенность "Службы управления сетью" (кто же переводил...) - WMSvc (служба удалённого управления IIS). После установки компонента, отвечающего за эту службу, создаётся самоподписанный сертификат WMSvc... Имею свою CA, выдал сертификаты серверам, для которых мне необходимо удалённого управления через консоль IIS. Естественно, раздавать самоподписанные сертификаты через GPO как доверенные нет желания, попробовал заменить сертификаты, которые использует WMSvc для SSL подключения консоли IIS, на уже полученные сертификаты:

    $ComputerName = 'srv-wsus';
    
    Invoke-Command `
        -ComputerName $ComputerName `
        -ScriptBlock {
            Import-Module `
                Microsoft.PowerShell.Security `
                , WebAdministration `
            ;
            if ( -not ( Get-WindowsFeature -Name 'Web-Mgmt-Service' ).Installed ) {
                Install-WindowsFeature -Name 'Web-Mgmt-Service';
            };
            Set-Service `
                -Name 'WMSvc' `
                -StartupType Automatic `
            ;
            Stop-Service 'WMSvc' -Force;
    
            $cert = `
                Get-ChildItem Cert:\localmachine\my `
                | ? { 
                    ( $_.Subject -eq "CN=$( $env:COMPUTERNAME ).$( $env:USERDNSDOMAIN )" ) `
                    -and (
                        $_.EnhancedKeyUsageList `
                        | ? { $_.ObjectId -eq '1.3.6.1.5.5.7.3.1' }
                    )
                } `
            ;
            Set-Item `
                -Path 'IIS:\SslBindings\0.0.0.0!8172' `
                -Value $cert `
            ;
            Set-ItemProperty `
                -Path HKLM:\SOFTWARE\Microsoft\WebManagement\Server `
                -Name EnableRemoteManagement `
                -Value 1 `
            ;
            Start-Service 'WMSvc';
    
            Get-ChildItem Cert:\localmachine\my `
            | ? { $_.Subject -match 'WMSvc-.+' } `
            | Remove-Item `
            ;
        } `
    ;

    И после этих манипуляций служба WMSvc перестаёт запускаться! В реесте - всё в порядке, сертификат привязан правильный, всё проверял. Неужели служба WMSvc может использовать только самоподписанный сертификат для SSL сеанса? Коллеги, подскажите! Крайне желательно, чтобы рецепты можно было применить удалённо (PowerShell), потому как сервера в core mode.

    P.S> Идею подглядел здесь: http://stackoverflow.com/questions/5962559/is-it-possible-to-create-sslbinding-without-navigating-to-iis-sslbindings


    С Уважением, Бетке Сергей Сергеевич, http://sergey-s-betke.blogs.novgaro.ru


    6 февраля 2013 г. 13:46

Ответы

  • В итоге - нашёл некрасивое решение (нарушены принципы инкапсуляции, подозреваю - есть другие, более красивые решения, буду крайне благодарен за подсказку). Необходимо в скрипт добавить следующее:

    Set-ItemProperty `
        -Path HKLM:\SOFTWARE\Microsoft\WebManagement\Server `
        -Name SslCertificateHash `
        -Value ( $cert.GetCertHash() ) `
    ;

    Лучше ещё добавить при этом:

    Remove-ItemProperty `
        -Path HKLM:\SOFTWARE\Microsoft\WebManagement\Server `
        -Name SelfSignedSslCertificateHash `
    ;
    И служба WMSvc прекрасно стартует после этого, всё в ажуре. Неужели нет .net обёрток, чтобы не лезть в реестр грязными руками?

    С Уважением, Бетке Сергей Сергеевич, http://sergey-s-betke.blogs.novgaro.ru

    7 февраля 2013 г. 7:49

Все ответы

  • При локальном запуске диспетчера IIS в компоненте "Службы управления" сертификат НЕ ВЫБРАН! Явно выбрал сертификат сервера - и всё в порядке, служба запустилась. ИТого, причина ясна - я не совсем корректно заменяю сертификат для службы WMSvc. Вопрос - как это сделать правильно?

    Подскажите пожалуйста, как подправить powerShell сценарий для этих целей, чего я в итоге не доделал?


    С Уважением, Бетке Сергей Сергеевич, http://sergey-s-betke.blogs.novgaro.ru

    6 февраля 2013 г. 13:57
  • Нашёл информацию: http://serverfault.com/questions/385180/how-to-assign-an-different-ssl-certificate-for-the-iis7-management-service-on-s Мой случай. Не хотелось пользоваться netsh, но попробовал, добавил в сценарий следующее:

    & netsh http add sslcert ipport=0.0.0.0:8172 certhash=$( $cert.Thumbprint ) appid=`{$( [guid]::NewGuid() )`}
    Результат остался прежним. Ещё раз - сертификат в $cert выбран корректно (отладчиком проверял), что же мешает?

    С Уважением, Бетке Сергей Сергеевич, http://sergey-s-betke.blogs.novgaro.ru


    6 февраля 2013 г. 14:22
  • Заметил одну интересную особенность: если использовать Set-Item в контексте iis:\sslbindings, тогда в созданной привязке не указано хранилище сертификата. Если же использовать New-Item - тогда указано.

    С Уважением, Бетке Сергей Сергеевич, http://sergey-s-betke.blogs.novgaro.ru

    6 февраля 2013 г. 15:15
  • Ещё несколько моментов обнаружил. В реестре присутствуют параметры кокнретно для службы удалённого управления, отвечающие за выбор сертификата:

     cd HKLM:\SOFTWARE\Microsoft\WebManagement\
    
    [ca]: PS HKLM:\SOFTWARE\Microsoft\WebManagement\> dir
    
    
        Hive: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WebManagement
    
    
    Name                           Property                                                                                              
    ----                           --------                                                                                              
    Server                         IPAddress                    : *                                                                      
                                   Port                         : 8172                                                                   
                                   RequiresWindowsCredentials   : 1                                                                      
                                   EnableLogging                : 1                                                                      
                                   RemoteRestrictions           :                                                                        
                                   SslCertificateHash           : {39, 32, 165, 247...}                                                  
                                   SelfSignedSslCertificateHash : {39, 32, 165, 247...}                                                  
                                   EnableRemoteManagement       : 1                        

    Параметра два - SslCertificateHash и SelfSignedSslCertificateHash. Естественно, при любым манипуляциях с привязками через netsh, конктекст iis:\sslBindings, никакие изменения в данный раздел реестра не вносятся, а при явном выборе сертификата в консоли iis (естественно - при локальном запуске консоли, что не есть решение - сервера в core mode, да и нужен вариант для автоматизации) - хеш меняется. Видимо, здесь и нужно искать проблему: служба запускается, пытается найти сертификат по хешу из реестра, не находит (я же самоподписанный сертификат удаляю) - и падает на этом. Поищу решение...

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


    С Уважением, Бетке Сергей Сергеевич, http://sergey-s-betke.blogs.novgaro.ru



    7 февраля 2013 г. 6:52
  • В итоге - нашёл некрасивое решение (нарушены принципы инкапсуляции, подозреваю - есть другие, более красивые решения, буду крайне благодарен за подсказку). Необходимо в скрипт добавить следующее:

    Set-ItemProperty `
        -Path HKLM:\SOFTWARE\Microsoft\WebManagement\Server `
        -Name SslCertificateHash `
        -Value ( $cert.GetCertHash() ) `
    ;

    Лучше ещё добавить при этом:

    Remove-ItemProperty `
        -Path HKLM:\SOFTWARE\Microsoft\WebManagement\Server `
        -Name SelfSignedSslCertificateHash `
    ;
    И служба WMSvc прекрасно стартует после этого, всё в ажуре. Неужели нет .net обёрток, чтобы не лезть в реестр грязными руками?

    С Уважением, Бетке Сергей Сергеевич, http://sergey-s-betke.blogs.novgaro.ru

    7 февраля 2013 г. 7:49