Миграция CA с NDES. Можно ли сохранить тот же пароль вызова для MSCEP?

У нас есть приложение, которое в настоящее время работает на Server 2008 R2 по всем направлениям, и мы надеемся обновить все серверы до 2012 R2 (это последняя ОС, совместимая с приложением).

У нас есть один контроллер домена, который также выступает в качестве сервера центра сертификации, в ЦС установлен NDES, который предоставляет нам пароль для вызова, который мы используем для определенных устройств для получения сертификатов для связи с приложением.

У меня есть рабочий процесс для миграции DC, а также CA, который, кажется, работает нормально. Однако после того, как я перенес CA, мне нужно отдельно установить роль NDES на новом сервере, что, в свою очередь, дает мне другой пароль для вызова (к вашему сведению, отпечаток для сертификата CA остается прежним).

Это имеет смысл, так как это совершенно новая установка NDES, так что это должно быть разработано.

Было бы полезно иметь возможность сохранить тот же пароль вызова после переноса, так как тогда нам не нужно было бы переходить на каждое устройство и вводить новый PW. Это возможно?

0 ответов

TLDR: Да, запустите скрипт ниже.

NDES сохраняет пароль вызова в ключе HKLM\SOFTWARE\Microsoft\Cryptography\MSCEP\EncryptedPassword. Он хранится с использованием обратимого шифрования, поэтому вы можете увидеть пароль вызова при посещении веб-сайта. Microsoft использует DPAPI для шифрования / дешифрования этого ключа, что означает, что он привязан к учетной записи службы, под которой работает NDES. Вы можете использовать вызовы API CryptProtectedData и CryptUnprotectData для чтения / записи пароля SCEP. Microsoft делает это проще для нас, поскольку они предоставляют эти API для использования в.net, что означает, что мы можем использовать их в powershell! Ниже приведен скрипт, который я создал, чтобы выполнить это в моей собственной миграции CA. Войдите на сервер NDES с учетными данными учетной записи службы, которые вы указали при настройке службы, и запустите приведенный ниже сценарий. Он запросит пароль для вызова, который вы хотели бы использовать, установите его в реестре и перезапустите IIS. Если учетная запись службы SCEP не имеет разрешений для перезапуска IIS, вам придется сделать это вручную с учетной записью пользователя, которая делает это.

[System.Reflection.Assembly]::LoadWithPartialName("System.Security")
$newPw = ""
while($true) {
    $newPw = Read-Host "Please enter desired SCEP password"
    if($newPw.Legnth%2 -eq 0 -and $newPw.Length -gt 0) {
        [char[]]$pwdChars = New-Object Char[] $(($newPw.Length*2)+2)
        for($i = 0; $i -lt $newPw.Length; $i++) {
            $pwdChars[$i*2] = $newPw[$i]
            $pwdChars[($i*2)+1] = 0
        }

        $password = $pwdChars -Join ""

        $key = "HKLM:\SOFTWARE\Microsoft\Cryptography\MSCEP\"
        $encPw = "EncryptedPassword"
        $snglPw = "UseSinglePassword"
        $pwLngth = "PasswordLength"
        $protectedData = [Security.Cryptography.ProtectedData]::Protect([Text.Encoding]::ASCII.GetBytes($password), $null, 'CurrentUser')
        Set-ItemProperty -Path $($key + $encPw) -Name $encPw -Value $protectedData
        Set-ItemProperty -Path $($key + $snglPw) -Name $snglPw -Value 1 -Type DWORD
        Set-ItemProperty -Path $($key + $pwLngth) -Name $pwLngth -Value $($newPw.Length/2) -Type DWORD
        Write-Host "Restarting IIS"
        &iisreset
        break
    }
    if($newPw.Length -eq 0) {
        Write-Host "No password entered, exiting..."
        break
    }
    if(($newPw.Length%2) -ne 0) {
        Write-Host "Invalid password. Password must be an even number of characters"
    }
}
Другие вопросы по тегам