使用NDES迁移CA。是否可以为MSCEP保留相同的质询密码?

时间:2018-10-16 10:46:14

标签: certificate ca scep

我们有一个目前可以在Server 2008 R2上全面运行的应用程序,并且我们希望将所有服务器升级到2012 R2(这是与该应用程序兼容的最新操作系统)。

我们有一个域控制器,同时也充当了证书颁发机构的服务器,CA安装了NDES,它为我们提供了质询密码,我们在某些设备上使用该密码来提取证书以与应用程序进行通信。

我有一个工作流程来迁移DC和CA,这似乎工作正常。但是,一旦我迁移了CA,就必须在新服务器上分别安装NDES角色,这反过来又给了我一个不同的质询密码(FYI,CA证书的指纹保持不变)。

这是有道理的,因为它是NDES的全新安装,因此这必须是设计使然。

能够在迁移后保留相同的质询密码会很有用,因为这样我们就不必转到每个设备并输入新的PW。这可能吗?

1 个答案:

答案 0 :(得分:0)

TLDR:是的,运行以下脚本。

NDES将质询密码存储在HKLM \ SOFTWARE \ Microsoft \ Cryptography \ MSCEP \ EncryptedPassword密钥中。它使用可逆加密存储,这就是为什么您访问网站时可以看到质询密码的原因。 Microsoft使用DPAPI对该密钥进行加密/解密,这意味着该密钥与运行NDES的服务帐户绑定。您可以使用CryptProtectedDataCryptUnprotectData API调用来读取/写入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"
    }
}