为什么我的应用用户找不到始终加密的证书?

时间:2018-04-27 09:17:42

标签: sql-server always-encrypted

使用SQL Server 2017我按照本文应用Always Encrypt技术: https://www.codeproject.com/Articles/1110564/Always-Encrypted-feature-in-SQL-Server 这简单地说:

  1. 创建列主密钥。
  2. 创建列加密密钥。
  3. 加密 使用后者的列。
  4. 使用向导生成用于步骤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'。   证书商店“我的”在证书位置“LocalMachine”中找不到指纹“...”的证书。验证数据库中列主密钥定义中的证书路径是否正确,并且证书已正确导入证书位置/存储。   参数名称:masterKeyPath'

    我得到的是,运行此应用的用户无法访问该位置以获取证书,但为什么?
    如果我以管理员的身份运行该应用程序,它将正常工作。

    我打开了mmc并检查了Certificates (Local Computer)并找到了步骤1中使用的证书。,看起来它在本地计算机中是正确的,而不是当前用户。< / p>

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

1 个答案:

答案 0 :(得分:3)

这个答案帮助我解决了这个问题:
How to give ASP.NET access to a private key in a certificate in the certificate store?

我们的想法是授予那些将运行应用程序的用户(或者对于IIS应用程序池用户的Web应用程序)授予能够读取私钥的权限。

在正确答案中说明了如何授予IIS用户权限,您可以对运行应用程序的用户执行相同的操作。

<强>更新 如果您的应用程序位于一台服务器上且数据库位于另一台服务器上(因此您很可能是数据库服务器上的加密证书),则需要导出然后将该证书从DB服务器导入到您的服务器中应用服务器并向运行您应用的用户授予使用此证书私钥的权限。