Миграция CA с NDES.Можно ли сохранить тот же пароль вызова для MSCEP? - PullRequest
0 голосов
/ 16 октября 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 02 августа 2019

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"
    }
}
...