我正尝试在MS SQL Server 2016数据库的几列上实施始终加密功能。事实上,我已经在我的UAT DB上成功地实现了它。然而,当我尝试在我的生产数据库上执行相同的步骤时,我得到了以下错误:
Set-SqlColumnEncryption :未能使用密钥存储区提供程序'MSSQL_CERTIFICATE_ store‘解密列加密密钥。加密列加密密钥的最后10个字节是:‘xx-xx’。密钥集不存在
一些细节:我正在执行命令
Set-SqlColumnEncryption -ColumnEncryptionSettings $l_columnEncryptionSettings -InputObject $l_database在powershell中。主列密钥位于运行该进程的帐户的ms sql用户存储区中。它可以在certmgr的“证书-当前用户\个人\证书”中看到,它包含公钥和私钥(显示证书信息显示“您有一个对应于此证书的私钥”)。

查看数据库中的Always-Encrypted Keys条目,Column Master Key显示密钥路径CurrentUser/my/<fingerprint>,其中<fingerprint>确实与MSSQL_CERTIFICATE_STORE中的证书指纹匹配。
我见过这个问题(Always Encrypted Feature - Failed to decrypt column. Call from Windows-Service App),但这里的“解决方案”要么不适用(我已经将公钥和私钥导入存储中),要么不清楚(它提到了对目录的“访问”,但没有提供哪种访问的详细信息,并且我正在处理的帐户确实具有对提到的目录的读取访问权限。)
最奇怪的是,我已经在同一台机器上为UAT DB (不同的DB、相同的SQL实例、不同的用户)成功地实现了它,但是我看不出两个设置之间有什么不同。
有没有人知道可能导致这个错误的原因或者如何纠正它?谢谢。
编辑:当我提出这个问题时,问题似乎是由于该功能的一些不正确的设置,所以这个问题是合理的。在进一步的调查中(见下文),它被证明是数据损坏,所以除了我自己,没有人可能会回答这个问题。
发布于 2018-02-13 07:29:45
CertMgr显示本地存储中的证书是用私钥导入的:打开证书清楚地显示“您有一个对应于此证书的私钥”,并且证书是从包含私钥的.pfx文件中导入的。但是,我从Misrosoft下载、编译并运行了"findprivatekey.exe“工具。我跑了
findprivatekey My currentUser -t "xx xx ... xx"奇怪的是它回来的时候
FindPrivateKey失败,原因如下:无法获取私钥文件名
事实上,无论我如何尝试指定证书(指纹、CN等),它总是返回相同的失败。我删除了证书并重新运行了导入脚本。同样的剧本,不同的日子。然后一切都变好了。
我只能得出结论,包含私钥文件的目录不知何故被损坏了。
附录:
对于其他有类似问题的人,详细说明了损坏的原因并解决了问题:第二天,私有证书数据再次消失。技术人员敏锐的眼睛注意到私钥的文件路径(如重新安装证书后立即由findprivatekey命令所示)位于“漫游”配置文件子树中,尽管该帐户配置为本地配置文件。一些调查揭示了Windows的一个名为“凭据漫游”的功能。仔细阅读这篇文档:https://social.technet.microsoft.com/wiki/contents/articles/11483.credential-roaming.aspx,末尾有一节“证书变得无法使用或续订”,在本例中适用。发出命令certutil -user -repairstore My "{Serialnumer}"已修复此问题。
https://stackoverflow.com/questions/48755679
复制相似问题