在 SQL Server 2014 中为不安全程序集创建非对称密钥

Creating asymmetric keys in SQL Server 2014 for unsafe assemblies

我有 2 个 DLL 在 Visual Studio (VS) 2015 中签名。一名前雇员创建了一个非对称密钥并登录,我 运行 一个程序集正确地处于 UNSAFE 模式。

第二个出现以下错误:

Msg 10327, Level 14, State 1, Line 27
CREATE ASSEMBLY for assembly 'TableFile' failed because assembly 'TableFile' is not authorized for PERMISSION_SET = UNSAFE. The assembly is authorized when either of the following is true: the database owner (DBO) has UNSAFE ASSEMBLY permission and the database has the TRUSTWORTHY database property on; or the assembly is signed with a certificate or an asymmetric key that has a corresponding login with UNSAFE ASSEMBLY permission.

我不能问前雇员,所以我怎么知道如何把这个发给 运行?我也试过这个:

USE master; 
GO  

CREATE ASYMMETRIC KEY AProjectKey FROM EXECUTABLE FILE = 'E:\sqldlls\TableFile.dll' 
CREATE LOGIN AProjectLogin FROM ASYMMETRIC KEY AProjectKey ;  
GRANT UNSAFE ASSEMBLY TO AProjectLogin ;
GO

这会产生以下错误:

Msg 15396, Level 16, State 1, Line 9
An asymmetric key with name 'AProjectKey' already exists or this asymmetric key already has been added to the database.

Msg 15151, Level 16, State 1, Line 10
Cannot find the asymmetric key 'AProjectKey', because it does not exist or you do not have permission.

Msg 15151, Level 16, State 1, Line 11
Cannot find the login 'AProjectLogin', because it does not exist or you do not have permission.

如何让这两个程序集 运行处于不安全模式?提前致谢。

关于这 3 条错误消息:

  1. 第一个可能是由于非对称密钥已经存在,但名称不同。密钥和证书在 public 密钥方面需要是唯一的,而不仅仅是名称(尽管这显然也需要是唯一的)。每个密钥和证书都有一个 public 密钥的散列,称为 "thumbprint"。创建新密钥/证书时会检查现有密钥/证书的指纹,如果指纹已经存在,将阻止创建,即使是名称不同的密钥/证书。这就是错误消息 "or this asymmetric key already has been added to the database".

    的意思

    或:

    这可能意味着 master 中存在不同的非对称密钥(即不同的 "thumbprint"),但名称为 AProjectKey

  2. 因为您无法以不同的名称创建相同的密钥,所以不存在具有该新名称的非对称密钥,因此您无法从中创建登录(因为 CREATE ASYMMETRIC KEY 语句失败)。
  3. 因为您无法创建登录名,所以它不存在,无法授予任何权限。

错误 # 2 有助于缩小问题范围。如果错误 # 1 是由具有相同名称但不同 "thumbprint" 的现有非对称密钥引起的,那么您要么能够创建登录名(如果它尚不存在),要么您会收到错误说明登录名(即 "server principal")已经存在。但错误是无法找到 name 的非对称密钥。这应该意味着非对称密钥本身确实已经存在,但名称不同。您可以通过执行以下命令查看创建了哪些非对称密钥:

SELECT * FROM sys.asymmetric_keys;

但这并不能告诉您哪一个来自该程序集(或使用用于签署此程序集的相同强名称密钥签名的程序集)。为此,您需要知道 "thumbprint",为此您需要打开命令提示符(最好是 "Developer Command Prompt",Visual Studio 在安装时设置,因为它设置了正确的路径打开它时)。然后,运行 以下内容:

CD /D E:\sqldlls\
sn -T TableFile.dll

你应该看到:

Public key token is XXXXXXXXXXXXXXXX

将 XXXXX "token"(即指纹)复制并粘贴到以下查询中:

SELECT ak.[name], ak.[sid]
FROM   sys.asymmetric_keys ak
WHERE  ak.[thumbprint] = 0x{XXXXXXXXXXXXXXXX}; -- remove the { and }

假设您返回一行,我们需要查看登录名是否存在。简单地尝试从非对称密钥创建登录名不会让我们获得登录名(如果它确实存在),因为每个密钥/证书只能创建 1 个登录名,并且错误消息仅报告您尝试创建的名称已经存在的那个,即使它可以是同一个密钥的不同名称。因此,从返回的行中获取 SID 并将其粘贴到以下查询中:

SELECT sp.*
FROM   sys.server_principals sp
WHERE  sp.[sid] = 0x{SID_from_sys_asymmetric_keys}; -- remove the { and }

如果没有返回任何行,那么您应该从该非对称密钥创建一个登录名。

此时应该存在一个登录名,因此授予它 UNSAFE ASSEMBLY 权限。

现在再次尝试创建程序集。