【问题标题】:Where does one place the Always Encrypted Certificate on an IIS 7.5 web server?IIS 7.5 Web 服务器上的始终加密证书放在哪里?
【发布时间】:2016-11-22 13:48:00
【问题描述】:

我们有一个使用 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 列表时使用的帐户。我们宁愿不使用这个帐户,那么再次,放置证书的合适位置在哪里?

【问题讨论】:

  • 嘿@RoastBeast,你最终解决了这个问题吗,我自己也在努力解决这个问题。不过我在 IIS10 上...
  • 根据主密钥配置部分中的docs.microsoft.com/en-us/azure/sql-database/…,只有两个地方可以存储证书 - Windows 证书存储或 Azure Key Vault。添加到 Windows 证书存储时,您可以添加为特定用户 (SA) 或本地计算机,这意味着有权访问该服务器的任何人都可以访问他们的密钥。我认为最安全的选择是只允许访问 SA,但我发现用户必须始终登录到服务器。
  • 还要澄清一下 - 我会说 Azure Key vault 会更安全,但在企业环境中,我们通常只能访问 Windows 证书存储,并在此处以本地用户身份添加证书(服务帐户)将阻止管理员使用证书自己访问数据。

标签: asp.net iis iis-7.5 sql-server-2016 always-encrypted


【解决方案1】:

IIS无法识别来自本地用户的证书,在SQL Server中创建证书时,默认是放入本地用户存储,做以下事情并确保在本地机器->当前用户下生成的证书证书存储

  1. 使用默认证书生成加密列
  2. 将所有加密列撤消为纯文本
  3. 从表安全“Your DB -> Tables -> Security -> Always Encrypted Keys”转到证书和密钥,然后右键单击“CEK_Auto 1”-> Script Column Encryption Key as -> Create to new window,保留这个生成的脚本
  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. 其余所有相同,确保在连接字符串中添加“列加密设置 = 已启用”。

谢谢

约翰·拉杰什·J

【讨论】:

  • 非常感谢。我一直在寻找几个小时,终于这对我有所帮助,
【解决方案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 用户load user profile

【讨论】:

  • 您能否在答案中添加更多细节?我能够将我的证书导出为 PFX 文件,但之后我就迷路了。
  • 如何将证书放入 App Pool 的商店?
  • 当我运行 certmgr 时,它在我的帐户下运行。如何让 certmgr 在 App Pool 的帐户下运行?
  • 我无法使用我的应用程序池用户的 certmrg.msc,因为它要求我以管理员身份启动它(并且我的应用程序池用户不是管理员)。但是,带有 Import-PfxCertificate 的变体对我有用: PS C:\>$cred = Get-Credential PS C:\>Import-PfxCertificate -FilePath '.\DB encryption key.pfx' -CertStoreLocation Cert:\CurrentUser\My\ -密码 $cred.Password
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多