始终加密:无法使用密钥存储提供程序解密列加密密钥:“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 语言文件操作 ( 文件加密解密 | 加密解密原理 | 对称加密 | 非对称加密 | 散列函数 )

如何在数据库中存储加密的机密用户信息,需要在运行时解密?

如何使用对称密钥加密和解密 SQL Server 中的整数数据类型列

支持多个解密密钥的 Python 加密方案

如何将密码加密到密钥表文件中?