我们有一个目前可以在Server 2008 R2上全面运行的应用程序,并且我们希望将所有服务器升级到2012 R2(这是与该应用程序兼容的最新操作系统)。
我们有一个域控制器,同时也充当了证书颁发机构的服务器,CA安装了NDES,它为我们提供了质询密码,我们在某些设备上使用该密码来提取证书以与应用程序进行通信。
我有一个工作流程来迁移DC和CA,这似乎工作正常。但是,一旦我迁移了CA,就必须在新服务器上分别安装NDES角色,这反过来又给了我一个不同的质询密码(FYI,CA证书的指纹保持不变)。
这是有道理的,因为它是NDES的全新安装,因此这必须是设计使然。
能够在迁移后保留相同的质询密码会很有用,因为这样我们就不必转到每个设备并输入新的PW。这可能吗?
答案 0 :(得分:0)
TLDR:是的,运行以下脚本。
NDES将质询密码存储在HKLM \ SOFTWARE \ Microsoft \ Cryptography \ MSCEP \ EncryptedPassword密钥中。它使用可逆加密存储,这就是为什么您访问网站时可以看到质询密码的原因。 Microsoft使用DPAPI对该密钥进行加密/解密,这意味着该密钥与运行NDES的服务帐户绑定。您可以使用CryptProtectedData和CryptUnprotectData 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"
}
}