【问题标题】:How can I give SQL Server permission to read my SSL Key?如何授予 SQL Server 读取我的 SSL 密钥的权限?
【发布时间】:2016-04-25 00:19:23
【问题描述】:

我最近创建了一个自签名证书并在 SQL Server 2014 中启用了加密:

问题是现在 SQL Server 服务无法启动:

This article 从 2010 年开始将该问题标识为权限问题:SQL Server 服务没有读取 SSL 证书私钥的必要权限。

问题是我卡在文章中提出的解决方案的第 4 步:

当我打开文章中显示的窗口时,没有符合建议格式的组或用户名。

是否有其他方法可以确定运行 SQL Server 服务的帐户,以便我可以授予它读取 SSL 证书的权限?

也欢迎完全不同的解决方案。

【问题讨论】:

  • 您使用哪个帐户用于 SQL Server windows 服务?我想您在访问c:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 中的证书私钥时遇到问题。您可以打开 MMC,添加证书管理单元,选择计算机,在个人中找到 SQL Server 证书,选择证书并选择“管理私钥”上下文菜单。之后,您应该授予用于运行 SQL Server 的帐户的权限。
  • 我忘了提到该帐户的读取权限应该足够了。
  • 如何找到我用于 SQL Server 服务的帐户?
  • @Oleg,fwiw,在“自签名证书的权限”窗口下,列出了 3 个用户/组——SYSTEM、Administrators 和 Account Unknown——并且所有 3 个至少具有读取权限.正如我所说,我现在知道这些帐户中有哪些(如果有)运行 SQL Server 服务,我也不知道如何找到。
  • 您应该只启动services.msc,找到SQL Server 服务,检查NT Service\MSSQL$SQL2014 之类的帐户名称,然后您应该授予该帐户读取权限。

标签: sql-server windows-services


【解决方案1】:

如果您指定了证书,SQL Server 应该将其用于 TLS,则 SQL Server windows 服务必须读取证书和私钥(来自文件夹 %ProgramData%\Microsoft\Crypto\RSA\MachineKeys 的文件),它对应于证书。问题是:SQL Server 配置管理器不舒服,它不能完成所有必需的工作

因此首先应该本地化 SQL Server 使用的帐户。应该启动services.msc,找到SQL Server服务的帐号。它通常是一个内置帐户,如 Local SystemNetwork Service 一个本地或域帐户,如 .\SQLServerDOMAIN\SQLServerAccount 或一个服务帐户,如下图中的NT Service\NT Service\MSSQL$SQL2012

要向帐户授予对私钥的权限,可以使用 mmc 的证书管理单元。可以启动mms.exe,在“文件”菜单中选择“添加/删除管理单元”,选择“证书”管理单元并选择本地计算机的“计算机帐户”。然后应该选择个人存储的 SSL 证书,然后使用上下文菜单“管理私钥...”。

并添加像上面找到的NT Service\NT Service\MSSQL$SQL2012 这样的帐户,并在私钥上为该帐户设置“读取”权限:

如果您想与域内的 SQL 服务器建立连接(客户端和服务器都必须属于同一个 Active Directory 或通过信任连接的目录),那么应该为SQL 服务器。如果我正确理解您的要求,您希望允许 删除 通过 HTTPS 连接到 SQL Server。必须激活混合安全才能通过 SQL Server 身份验证连接到服务器:

创建 SQL 登录后,进行上述所有更改并重新启动 SQL Server 服务将能够建立到 SQL Server 的 TLS(加密)连接。如果在之前没有创建 SPN 的情况下尝试通过 Windows 帐户进行连接,则会出现错误:

已成功与服务器建立连接,但随后出现 登录过程中发生错误。 (提供者:SSL 提供者, 错误:0 - 目标主体名称不正确。)(Microsoft SQL 服务器,错误:-2146893022)

目标主体名称不正确

如果忘记将 Windows 身份验证更改为混合身份验证 (),则会收到类似的错误

用户“OlegKi”登录失败。 (Microsoft SQL Server,错误:18456)

如果上述所有步骤都完成了,例如可以使用 SQL Management Studio 建立 TLS 连接,但仍然需要选择一些选项:

应该检查“加密连接”

并设置额外的连接属性TrustServerCertificate=true

通常使用Encrypt=true;TrustServerCertificate=true; 作为应用程序中连接字符串的一部分,用于建立与 SQL 服务器的连接。我们通过上面描述的“加密连接”复选框设置Encrypt=true 属性。更详细的属性含义和选项的不同组合可以在the MSDN article的“启用加密”部分阅读。

如果执行上述所有步骤并检查“加密连接”而不设置TrustServerCertificate=true 属性,则会出现错误:

已成功与服务器建立连接,但随后出现 登录过程中发生错误。 (提供者:SSL 提供者, 错误:0 - 目标主体名称不正确。)(Microsoft SQL 服务器,错误:-2146893022)

目标主体名称不正确

我已经在上面的另一种情况(与 Windows 帐户的连接)中进行了描述。

我描述了上述所有步骤,因为配置到服务器的 TLS 连接确实不是那么容易,并且可能会出现奇怪的错误,直接描述并没有直接提示如何解决问题。

【讨论】:

  • 惊人的答案!希望我能投票 10 次。我明天会试试这个。
  • @Jonah:不客气!请告诉我最终结果。我也更新了我之前的答案。我希望您也可以使用原始 SSL 证书。自签名证书的问题在于信任。必须将它在所有客户端上添加为受信任的根证书。因此,不要在任何实际场景中使用这种方式。
  • 对我的情况有帮助的“对私钥上的帐户设置“读取”权限的部分”!我挣扎了 9 天,直到我尝试从本地系统帐户运行该服务并且它起作用了,所以我明白我的问题是关于权限的。然后我找到了这个解决方案!点赞!
【解决方案2】:

另一个注意事项:如果您通过从证书管理器复制和粘贴手动将证书指纹输入注册表,则必须删除前导字符。它是一个不可见的 unicode 字符,但如果存在它会导致 SQL Server 服务无法启动。这是除了将其设为全大写并删除所有空格之外。

【讨论】:

    【解决方案3】:

    我也遇到了这个问题。我正在做的是:

    使用“导入”按钮从 sql server 协议属性对话框导入证书。我导入了公钥,然后打开了另一个打开的对话框来导入私钥。然后我将私钥权限设置为 sql server 服务。 直接导入密钥对(例如 .pfx 包)时,应用程序崩溃。 MachineKeys 的所有权限也被授予 sql 服务,但我无法通过进程监视器找到该路径被拒绝的任何访问。

    为了解决我的问题,我直接从资源管理器中导入了 pfx。我首先从存储中删除了密钥对,然后运行向导将 pfx 导入本地机器存储的个人文件夹中。我检查了私钥的权限,它们仍然是为 sql 服务设置的。我检查了协议属性,证书已经被选中。只有这样服务器才启动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 2011-03-25
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2016-10-12
      相关资源
      最近更新 更多