Sql server 为什么可以';我不能在SQL Server中为dll生成非对称密钥吗?

Sql server 为什么可以';我不能在SQL Server中为dll生成非对称密钥吗?,sql-server,sqlclr,encryption-asymmetric,Sql Server,Sqlclr,Encryption Asymmetric,我在VS中有一个数据库项目,正在尝试从dll在SQL Server中生成一个非对称密钥。在SSMS中,我尝试运行以下操作: CREATE ASYMMETRIC KEY MyNewKey FROM EXECUTABLE FILE = N'C:\{path to dll}\MyDBProj.dll' 我得到的错误是“证书、非对称密钥或私钥文件无效或不存在;或者您没有对此文件的权限。” 有问题的dll是使用SQLCLR权限级别=安全的方式生成的 我的假设是,它与文件权限有关,但我不知道需要对文件允

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

CREATE ASYMMETRIC KEY MyNewKey 
FROM EXECUTABLE FILE = N'C:\{path to dll}\MyDBProj.dll'
我得到的错误是“证书、非对称密钥或私钥文件无效或不存在;或者您没有对此文件的权限。”

有问题的dll是使用SQLCLR权限级别=安全的方式生成的

我的假设是,它与文件权限有关,但我不知道需要对文件允许哪些安全权限才能实现这一点。我被告知我应该给网络服务帐户读访问权限,我做到了


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

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

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

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


概述

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

关于SQL Server 2017的信息

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


请避免使用新的受信任程序集“功能”,因为它的缺陷比好处多得多,更不用说它在一开始是完全不必要的,因为现有功能已经处理了“受信任程序集”要解决的问题。有关这方面的详细信息以及处理现有未签名程序集的正确方法的演示,请参阅:。

是否需要退出斜杠?FWW您可以首先向每个人授予该文件的完全权限…以确保您的SQL代码是无错误的…当这起作用时,请删除权限,并在SQL使用的确切安全帐户中磨练。。。可能是SQL代理,而不仅仅是SQL Serveraccount@Grantly例如我不这么认为。我所看到的示例都没有转义字符。我没有意识到dll需要强签名。一旦我这样做了,一切都很好。@Random是的,这就是如何将公钥放入程序集中,以便通过
CREATE asymetric key
提取公钥的方法。我刚刚更新了我的答案,提供了关于这方面的信息,以及关于总体发展的新章节。