Dab*_*bas 1 sql-server always-encrypted
使用 SQL Server 2017 我按照这篇文章应用了 Always Encrypt 技术:https : //www.codeproject.com/Articles/1110564/Always-Encrypted-feature-in-SQL-Server 简单地说:
用于步骤 1.的证书是使用向导生成的并保存在:
密钥库: Windows Certificate Store - Local Machine
我创建了一个非常简单的控制台应用程序,它使用 EF 尝试从我对列进行加密的表中获取数据。
我在连接字符串中添加了这个:column encryption setting=Enabled.
当我尝试获取数据时:
using (MyEntities en = new MyEntities())
{
var x = en.TableHasColEnc.ToList();
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
'未能解密列'X'。无法使用密钥存储提供程序解密列加密密钥:“MSSQL_CERTIFICATE_STORE”。加密列加密密钥的最后 10 个字节是:'XX-XX-XX-XX-XX-XX-XX-XX-XX-XX'。在证书位置“LocalMachine”的证书存储“My”中找不到带有指纹“...”的证书。验证数据库中列主密钥定义中的证书路径是否正确,并且证书已正确导入到证书位置/存储中。参数名称:masterKeyPath'
我了解到运行此应用程序的用户无法访问该位置以获取证书,但为什么呢?
如果我以管理员身份运行该应用程序,它将正常工作。
我打开mmc并检查Certificates (Local Computer)并找到了在步骤 1 中使用的证书。它看起来在本地机器中正确,而不是当前用户。
为什么我会收到此错误以及如何解决?
这个答案帮助我解决了这个问题:
How to give ASP.NET access to a private key in the certificate store?
这个想法是授予将要运行应用程序的用户(或者在 Web 应用程序的情况下,IIS 应用程序池用户)能够读取私钥的权限。
在正确答案中解释了如何授予 IIS 用户权限,您可以对运行您的应用程序的人执行相同的操作。
更新 如果您的应用程序在一台服务器上而数据库在另一台服务器上(因此您的加密证书很可能在数据库的服务器上),您需要将该证书从数据库的服务器中导出然后导入到您的应用程序服务器,并提供给正在运行您的应用程序的用户使用此证书的私钥的权限。