这些密钥存储在本文底部列出的位置。许多网络管理员不知道这些文件的用途,并且网络上的一些论坛帖子错误地建议人们删除这些文件。当然,此类操作的影响是特定于实现/应用程序的。我无法使用以下代码读取文件(可能需要进行一些更改)
var files = System.IO.Directory.GetFiles(@"C:\ProgramData\Application Data\Microsoft\Crypto\RSA\MachineKeys\");
foreach (var f in files)
{
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
var readFile = File.OpenRead( f.ToString());
byte[] FileOut = new byte[readFile.Length];
readFile.Read( FileOut, 0, (int)readFile.Length-1);
rsaKey.ImportCspBlob(FileOut);
}
似乎需要“用户状态迁移工具”工具才能将此数据从一台计算机移动到另一台计算机。此外,在这样的移动之后,一些工具需要将 CryptoAPI 中的密钥暴露给 CNG。
我不知道有什么方法可以查看containerName
CSP 中引用的相关文件。
Microsoft 旧版 CryptoAPI CSP 将私钥存储在以下目录中。
用户私有
%APPDATA%\Microsoft\Crypto\RSA\User SID\ %APPDATA%\Microsoft\Crypto\DSS\User SID\
本地系统私有
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\S-1-5-18\ %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\S-1-5-18\
本地服务私有
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\S-1-5-19\ %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\S-1-5-19\
网络服务私有
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\S-1-5-20\ %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\S-1-5-20\
共享私人
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\MachineKeys
CNG 将私钥存储在以下目录中。
用户私有
%APPDATA%\Microsoft\Crypto\Keys
本地系统私有
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\SystemKeys
本地服务私有
%WINDIR%\ServiceProfiles\LocalService
网络服务专用
%WINDIR%\ServiceProfiles\NetworkService
共享私有
%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys
参考:
http://msdn.microsoft.com/en-us/library/bb204778(v=vs.85).aspx
LDAP
如果启用凭据漫游,这些密钥也存储在 LDAP 中
ldifde.exe -s %LOGONSERVER% -f cscverify.ldf -r "(cn=USERNAME)" -l msPKIAccountCredentials,msPKIRoamingTimeStamp,msPKIDPAPIMasterKeys
将此命令中的 USERNAME 一词替换为凭证漫游不起作用的用户名。要确保已执行 Active Directory 复制,请在命令中使用 -s 选项并将 %LOGONSERVER% 替换为用户实际登录的服务器。确保 cscverify.ldf 文件显示导出属性的值。
LDAP 条目的大小由 DIMSRoarmingMaxNumTokens 和 DIMSRoamingMaxTokenSize 注册表项控制(来源)