为什么我的应用程序用户找不到总是加密的证书



使用SQL Server 2017,我遵循本文应用始终加密技术:https://www.codeproject.com/articles/1110564/Always-Encrypted-feature-in-sql-server简单地说:

  1. 创建列主键。
  2. 创建列加密密钥。
  3. 加密使用后者的列。

用于步骤1的证书是使用向导生成的,并保存在:
密钥存储: Windows Certificate Store - Local Machine

我创建了非常简单的控制台应用程序,该应用程序使用EF尝试从我对列进行加密的表中获取数据。

我添加到连接字符串:column encryption setting=Enabled

当我尝试获取数据时:

    using (MyEntities en = new MyEntities())
    {
        var x = en.TableHasColEnc.ToList();
    }

我得到此错误:

'无法解密列'x'。 无法使用密钥存储提供商解密列加密密钥:" mssql_certificate_store'。加密列加密密钥的最后10个字节是:'xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx'。 证书'...'在证书存储中找不到的"我的"我的" in Centerrip"位置" localmachine"(。验证数据库中"主密钥"定义中的证书路径正确,并且证书已正确导入到证书位置/存储中。 参数名称:MasterKeypath'

我得到的是,正在运行此应用程序的用户无法访问该位置以获取证书,但是为什么?
如果我以admin的范围运行该应用程序。

我打开了mmc并检查了Certificates (Local Computer),并找到了已在>步骤1中使用的证书。

为什么我会遇到此错误以及如何解决?

这个答案帮助我解决了问题:
如何在证书存储中的证书中访问ASP.NET?

这个想法是授予将运行该应用程序的用户(或在Web应用程序的情况下,IIS应用程序池用户(能够读取私钥。

在正确的答案中说明了如何授予IIS用户的权限,您可以为正在运行您的应用程序的人做同样的事情。

更新如果您的应用在一台服务器上,并且数据库在另一台服务器上(因此您的加密证书很可能在DB的服务器上(,则需要导出,然后将该证书从DB的服务器导入到您的应用程序服务器,并为正在运行应用程序的用户提供使用此证书的私钥的权限。

最新更新