8

我们有一个使用 Always Encrypted 的 SQL Server 2016 数据库。我们最近发布的 ASP.net 网站尝试从该数据库中提取数据,但当我们收到此错误时:

Error: Failed to decrypt column 'EnSSd'. Failed to decrypt a column encryption key using key store provider: 'MSSQL_CERTIFICATE_STORE'. The last 10 bytes of the encrypted column encryption key are: 'B8-48-B3-62-90-0B-1D-A6-7D-80'. Certificate with thumbprint '97B0D3A64CADBE86FE23559AEE2783317655FD0F' not found in certificate store 'My' in certificate location 'CurrentUser'. Verify the certificate path in the column master key definition in the database is correct, and the certificate has been imported correctly into the certificate location/store. Parameter name: masterKeyPath

现在我们知道这意味着证书没有放在服务器上的正确位置。在开发过程中,我们只是将证书放在个人证书存储下的证书管理单元中,这很有效,但是现在网站已经发布,我们尝试在 Web 服务器上做同样的事情,但它不起作用(我们有点想通了)不会)。

站点上启用了匿名身份验证,匿名用户身份为 IUSR。ASP.NET 模拟已禁用。

放置证书的正确位置在哪里?


更新 - 我们通过将应用程序池身份帐户更改为创建证书的帐户来使其工作。它也是将证书添加到 Web 服务器上的 Current User-Personal 列表时使用的帐户。我们宁愿不使用这个帐户,那么再次,放置证书的正确位置在哪里?

4

3 回答 3

3

IIS无法识别来自本地用户的证书,在SQL Server中创建证书时,默认将其放入本地用户存储,执行以下操作并确保在本地计算机->当前用户证书存储下生成的证书

  1. 使用默认证书生成加密列
  2. 将所有加密列撤消为纯文本
  3. 从表安全性“您的数据库->表->安全性->始终加密的密钥”中转到证书和密钥,然后右键单击“CEK_Auto 1”->脚本列加密密钥为->创建到新窗口,保持这个生成脚本
  4. 删除 CEK_Auto 1
  5. 对“CMK_Auto 1”证书执行第 3 步并删除它
  6. 在“CMK_Auto 1”脚本中将证书路径“CurrentUser”更改为“LocalMachine”
  7. 您的示例路径将是这样的“N'LocalMachine/my/G4452V8ERH035D2557N235B29MWR0SV834263G26'”
  8. 执行 CMK_Auto 1 和 CEK_Auto 1 脚本
  9. 确保证书生成的本地机器个人目录
  10. 它会起作用,如果不使用 IIS express 进行测试,这意味着您的证书仍然保存在本地用户个人目录中
  11. 其余所有相同确保在连接字符串中添加了“列加密设置=启用”。

谢谢

约翰·拉杰什

于 2017-10-10T12:00:03.943 回答
2

Always Encrypted 要求访问数据库的用户同时拥有公钥和私钥,这似乎要求您使用帐户来生成证书,因为他们将拥有此密钥。

我通常做的是生成证书并使用私钥和安全密码导出证书。然后将带有密钥的证书导入您用于运行应用程序池的帐户的个人存储中。这不能是通用集成帐户,必须是您指定的服务帐户。

以用户身份运行 powershell 脚本:

whoami
COMPUTER\myIISPoolUser
Set-Location -Path cert:\localMachine\my
Import-PfxCertificate –FilePath c:\AlwaysEncrypt.pfx

或使用 mmc。

whoami
COMPUTER\myIISPoolUser
certmgr.msc

您还必须允许 APP Pool 用户加载用户配置文件

于 2016-07-21T18:16:50.410 回答
0

在 IIS Express 上运行不同于在 IIS 上运行。

当我们当时从 SSMS 创建列主密钥 (CMK) 时,它会根据我们在创建 CEK 时设置的位置生成始终加密的证书。

对于 IIS,您必须在 MyLocalMachine 下生成证书,然后在具有管理员权限的托管服务器上安装证书。这对你有用。

您还需要将该证书的访问权限授予 IIS 用户。这可以通过右键单击证书然后单击管理主键并添加 IUSR 来完成。

于 2019-03-14T06:11:10.470 回答