【问题标题】:Why can't I generate an asymmetric key in SQL Server for a dll?为什么我不能在 SQL Server 中为 dll 生成非对称密钥?
【发布时间】:2018-08-24 19:05:03
【问题描述】:

我在 VS 中有一个数据库项目,并试图在 SQL Server 中从 dll 生成一个非对称密钥。在 SSMS 中,我尝试运行以下命令:

CREATE ASYMMETRIC KEY MyNewKey 
FROM EXECUTABLE FILE = N'C:\{path to dll}\MyDBProj.dll'

我得到的错误是“证书、非对称密钥或私钥文件无效或不存在;或者您没有权限。”

有问题的 dll 是使用 SQLCLR 权限级别 = SAFE 构建的

我的假设是它与文件权限有关,但我不知道我需要在文件上允许哪些安全权限才能实现这一点。我被告知我应该授予 NETWORK SERVICE 帐户读取权限,我照做了。

这是在具有混合模式身份验证的本地数据库上。我已经以 Windows 用户和 sa 帐户的身份进行了尝试。

【问题讨论】:

  • 你需要转义你的斜线吗? FWIW
  • 您可以首先授予每个人对该文件的完整权限...以确保您的 SQL 代码完美无缺...。当这样工作时,删除权限并磨练您 SQL 使用的确切安全帐户... 可能是 SQL 代理,而不仅仅是 SQL Server 帐户
  • @Grantly:我不这么认为。我见过的例子都没有转义字符。

标签: sql-server sqlclr encryption-asymmetric


【解决方案1】:

鉴于您使用的是 SQL Server Express LocalDB(它作为您的登录名运行,因此没有权限问题),唯一会导致此类错误的是您没有实际签署程序集。这可以通过项目属性的 SQLCLR 选项卡中的“签名...”按钮在 Visual Studio 中完成。

签署一个程序集(无论是通过给它一个强名称还是添加一个证书)将用于签署它的任何东西的公钥放置在程序集中。 CREATE ASYMMETRIC KEY 语句将从通过强命名放置在那里的程序集中提取公钥。这与获取用于签署程序集的证书的公钥不同,因为它们是单独存储的。

当然,如果您所说的“本地数据库”是指它只是在您的开发工作站上运行,而不是专门的 SQL Server Express LocalDB,那么我猜它应该是 SQL Server Express?如果您以自己的身份登录 SQL Server(您说您以 Windows 用户身份尝试过)并且您是 sysadmin,那么仍然不应该存在任何文件系统权限问题,也不应该存在创建非对称密钥的任何问题。


常规

有关使用 SQLCLR 的更多信息,请参阅我在 SQL Server Central 上就该主题撰写的系列文章:Stairway to SQLCLR

关于 SQL Server 2017

SQL Server 2017 引入了一项新的安全功能(“CLR 严格安全”,一个高级选项),该功能默认启用,并要求所有程序集,即使是那些标记为 SAFE 的程序集,都使用非对称密钥(即强名称)或证书并具有具有UNSAFE ASSEMBLY 权限的登录名(基于用于签署程序集的任何内容)。有关如何使用或不使用 Visual Studio / SSDT 的详细信息,请参阅我的以下两篇文章:

请避免使用新的受信任程序集“功能”,因为它的缺陷多于好处,更不用说它完全没有必要,因为现有功能已经处理了“受信任程序集”旨在解决的情况。有关这方面的全部详细信息以及处理现有未签名程序集的正确方法的演示,请参阅:SQLCLR vs. SQL Server 2017, Part 4: “Trusted Assemblies” – The Disappointment

【讨论】:

  • 我没有意识到需要对 dll 进行强签名。一旦我这样做了,一切正常。
  • @Random 是的,这就是您将公钥放入程序集的方式,以便可以通过CREATE ASYMMETRIC KEY 提取它。我刚刚更新了我的答案,提供了相关信息以及关于一般开发的新部分。
猜你喜欢
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 2018-04-28
  • 2021-05-10
  • 2023-03-13
  • 2011-10-01
相关资源
最近更新 更多