为什么我不能在 SQL 服务器中为 dll 生成非对称密钥?

Why can't I generate an asymmetric key in SQL Server for a dll?

我在 VS 中有一个数据库项目,我正在尝试从 dll 在 SQL 服务器中生成一个非对称密钥。在 SSMS 中,我正在尝试 运行 以下操作:

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

我得到的错误是"The certificate, asymmetric key, or private key file is not valid or does not exist; or you do not have permissions for it."

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

构建的

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

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

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

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

当然,如果 "a local db" 你的意思是它只是 运行 在你的开发工作站上,而不是具体 SQL Server Express LocalDB,那么我想它会是 SQL服务器快递?如果您以自己的身份登录 SQL 服务器(您说您以 Windows 用户身份尝试过)并且您是 sysadmin,那么仍然不应该有任何文件系统权限问题,也不创建非对称密钥的任何问题。


一般

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

关于 SQL 服务器 2017

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

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