始终加密:无法使用密钥存储提供程序解密列加密密钥:“MSSQL_CERTIFICATE_STORE”
Posted
技术标签:
【中文标题】始终加密:无法使用密钥存储提供程序解密列加密密钥:“MSSQL_CERTIFICATE_STORE”【英文标题】:Always Encryption: Failed to decrypt a column encryption key using key store provider: 'MSSQL_CERTIFICATE_STORE' 【发布时间】:2017-10-27 12:37:02 【问题描述】:我在我的 Web 应用程序中执行始终加密,它通过由窗口服务托管的 WCF 服务插入数据。将数据插入加密列时出现以下错误。
无法使用密钥存储提供程序解密列加密密钥:“MSSQL_CERTIFICATE_STORE”。加密列加密密钥的最后 10 个字节为:'64-56-87-3B-EC-2E-11-9D-2A-B5'。 在证书位置“CurrentUser”的证书存储“My”中找不到带有指纹“A0D10777759BBD947EEA6F3F5D1A7989514C45F0”的证书。验证数据库中主密钥定义列中的证书路径是否正确,并且证书已正确导入到证书位置/存储中。 参数名称:masterKeyPath
【问题讨论】:
@Alpay 你做了什么错误信息提示(验证提供的指纹证书是否存在于提供的商店中)? @Evk 我从当前用户导出密钥并将其导入本地计算机,以便 iis 能够看到证书,但它没有帮助。错误消息说它应该在当前用户下,但它已经存在(sql server management studio 默认放置在那里),我可以使用 sql server management studio 看到解密数据 【参考方案1】:这个问题的解决办法是
-
运行 (MMC)
在 snap 控制台中选择证书。
找到始终加密的证书,我的用户或机器帐户
右键->所有任务->管理私钥。
添加正在建立 SQL 连接的 windows 用户。
用户可以是进程用户,可以是 IIS 或任何 windows 登录用户。
它解决了我的问题。
【讨论】:
【参考方案2】:好的,我发现了问题。情况正是如此:我使用以我自己的帐户开始的 SQL Server Management Studio 为列设置始终加密。因为我使用自己的 Windows 帐户运行 SSMS 进程,所以它将证书放在我帐户的 Current User / MY 目录中。但是 IIS 应用程序池使用不同的帐户运行,因此它在我帐户的 CurrentUser/My 目录下找不到证书。
我使用启动 SSMS 并创建证书的同一帐户重新启动了 IIS 应用程序池,问题就消失了。
谢谢
【讨论】:
嗨,你能解释一下你是怎么做到的吗?我有同样的问题 @tal 请注意我的最后一句话。转到 IIS 管理器/应用程序池并选择您的池。在高级设置/流程模型下,您可以将用户更改为真正“拥有”证书的用户。 此更改没有安全问题吗?因为我使用 Windows 身份验证.. @tal 或者,您可以使用与 IIS 池中相同的用户运行 sql server management studio,我相信。如果您使用特定用户运行 ssms 并创建证书,它将被安装到该用户的 MY 目录中,以便 IIS 能够找到证书 我认为这对你来说是巧合。 AppPool Identity 很可能是一个与在数据库中生成密钥没有任何关系的帐户。一个例子可能是应用程序池标识是用于登录身份验证的 Active Directory 帐户。【参考方案3】:当您开始在 Visual Studio 或 Web 服务器上使用数据库时,可能会发生这种情况,而不是存储 Always Encrypted DB 的计算机。
您的部分消息将是:在证书位置“CurrentUser”的证书存储“My”中找不到带有指纹“............BAE90”的证书。
转到数据库所在的计算机。 打开证书管理器。
右键单击“证书 - 当前用户”并查找最后几位数字(在示例 BAE90 中)。 用户查看字段:SHA1 哈希。
找到证书后,右键单击它并导出到文件。
在新的 Visual Studio 机器上打开证书管理器并导入证书,您应该一切顺利。
与其他答案一样,您还需要将应用程序池中的用户“同步”到已添加证书的用户。
【讨论】:
【参考方案4】:我遇到过同样的问题并尝试了很多解决方案,但实际的解决方案非常简单,解决了我的问题。
要在ii的服务器上安装证书,无论您的db服务器是在另一台服务器上还是同一台服务器上:
1 - 转到ii服务器的证书管理器:在“运行”中键入certmgr.msc,然后按Enter
2 - 您将找到个人文件夹 --> 证书文件夹:右键单击它并导入您的证书。
3 - 从文件中选择您的证书,然后选择自动检测路径选项单选按钮并完成安装,而不是在个人上安装它。
4 - 请记住,此已安装的证书不会出现在您的个人 --> 证书文件夹下,但您的应用程序会在此之后运行,因为证书将自动安装在正确的路径上。
经过 3 天的研发,这个解决方案对我有用。
【讨论】:
以上是关于始终加密:无法使用密钥存储提供程序解密列加密密钥:“MSSQL_CERTIFICATE_STORE”的主要内容,如果未能解决你的问题,请参考以下文章
Spring SAML:解密加密密钥时出错,没有安装的提供程序支持此密钥
C 语言文件操作 ( 文件加密解密 | 加密解密原理 | 对称加密 | 非对称加密 | 散列函数 )