0

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

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

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

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

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

4

1 回答 1

0

TLDR:是的,在脚本下面运行。

NDES 将质询密码存储在 HKLM\SOFTWARE\Microsoft\Cryptography\MSCEP\EncryptedPassword 密钥中。它使用可逆加密存储,这就是您在访问网站时可以看到质询密码的原因。Microsoft 使用 DPAPI 加密/解密此密钥,这意味着它与运行 NDES 的服务帐户绑定。您可以使用CryptProtectedDataCryptUnprotectData用于读取/写入 SCEP 密码的 API 调用。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"
    }
}
于 2019-08-02T01:31:38.427 回答