设置Always-Encrypted功能时,Set-SqlColumnEncryption无法从ms证书存储中查找或检索主列密钥

时间:2018-02-12 21:20:19

标签: powershell windows-services sql-server-2016 always-encrypted

我正在尝试在MS SQL Server 2016数据库的几列上实现Always-Encrypted功能。事实上,我已经在我的UAT DB上成功实现了它。但是,当我尝试在生产数据库上执行相同的步骤时,我收到以下错误:

Set-SqlColumnEncryption:无法使用密钥库提供程序解密列加密密钥:' MSSQL_CERTIFICATE_STORE'。加密列加密密钥的最后10个字节是:&x; xx-xx-xx-xx-xx-xx-xx-xx-xx-xx'。 键集不存在

一些细节:我正在执行命令

Set-SqlColumnEncryption -ColumnEncryptionSettings $l_columnEncryptionSettings -InputObject $l_database
在powershell中

。主列密钥IS在运行该进程的帐户的ms sql用户存储中。它可以在证书 - 证书 - 当前用户\个人\证书"中的certmgr中看到,它包含公钥和私钥(显示证书信息显示"您有一个对应的私钥这个证书")。

enter image description here

查看数据库中的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),但是&#34;解决方案&#34;有两个不适用(我已将公钥和私钥导入商店),或者不清楚(它提到&#34;访问&#34;到一个目录,但没有提供什么样的访问的详细信息,以及帐户我我正在处理确实有读访问目录。)

最奇怪的是,我已经在UAT DB的同一台机器上成功实现了它(不同的数据库,相同的SQL实例,不同的用户),但我发现这两种设置没有区别。

有谁知道可能导致此错误的原因或如何纠正错误?感谢。

编辑:当我提出这个问题时,问题似乎与该功能的一些不正确的设置,所以问题是合理的。在进一步调查(见下文)时,结果是数据损坏,所以除了我自己之外没有人能够回答这个问题。

1 个答案:

答案 0 :(得分:0)

CertMgr显示本地存储中的证书已使用私钥导入:打开证书清楚地显示“您有一个与此证书对应的私钥”,并且证书是从包含.pfx文件的.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}"解决了问题。