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

时间:2017-11-15 05:33:39

标签: c# sql-server assemblies sqlclr encryption-asymmetric

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

我在第二个错误中收到以下错误:

  

Msg 10327,Level 14,State 1,Line 27
     程序集“TableFile”的CREATE ASSEMBLY失败,因为程序“TableFile”未获得PERMISSION_SET = UNSAFE的授权。如果满足以下任一条件,则授权程序集:数据库所有者(DBO)具有UNSAFE ASSEMBLY权限,并且数据库具有TRUSTWORTHY数据库属性;或者使用具有相应登录权限的证书或非对称密钥对程序集进行签名。

我不能问这位前雇员,所以如何找到如何让它运行?我也尝试了这个:

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
   名称为“AProjectKey”的非对称密钥已存在,或者此非对称密钥已添加到数据库中。

     

Msg 15151,Level 16,State 1,Line 10
  找不到非对称密钥'AProjectKey',因为它不存在或您没有权限。

     

Msg 15151,Level 16,State 1,Line 11
  无法找到登录'AProjectLogin',因为它不存在或您没有权限。

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

1 个答案:

答案 0 :(得分:1)

关于这3条错误消息:

  1. 第一个原因可能是由于Asymmetric Key已经存在,但名称不同。密钥和证书在公钥方面需要是唯一的,而不仅仅是名称(尽管显然也需要是唯一的)。每个密钥和证书都有一个公钥的哈希值,称为" thumbprint"。创建新密钥/证书时,将检查现有密钥/证书的指纹,如果指纹已存在,则会阻止创建,即使是名称不同的密钥/证书也是如此。这就是错误消息的含义"或者这个非对称密钥已经添加到数据库"。

    OR:

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

  2. 由于您无法使用其他名称创建相同的密钥,因此该新名称不存在非对称密钥,因此您无法从中创建登录(因为{{1}再次声明失败)。
  3. 因为您无法创建登录信息,所以不会授予任何权限。
  4. 错误#2有助于缩小问题范围。如果错误#1是由现有的具有相同名称但不同的" thumbprint"的非对称密钥引起的,那么您可以创建登录(如果它尚不存在),或者您将拥有得到一个错误,指出Login(即"服务器主体")已经存在。但错误是无法找到 name 的非对称密钥。这应该意味着Asymmetric Key本身已经存在,但名称不同。您可以通过执行以下操作来查看已创建的非对称密钥:

    CREATE ASYMMETRIC KEY

    但是,这并没有告诉你哪一个来自大会(或者一个大会签署了同一个强名称密钥用于签署这个大会)。为此你需要知道" thumbprint",为此你需要打开一个命令提示符(最好是"开发人员命令提示符" Visual Studio在安装时设置,因为它有打开它时设置的正确路径)。然后,运行以下命令:

    SELECT * FROM sys.asymmetric_keys;
    

    您应该看到:

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

    复制并粘贴XXXXX"令牌" (即指纹)进入以下查询:

    Public key token is XXXXXXXXXXXXXXXX
    

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

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

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

    此时登录应该存在,因此授予它SELECT sp.* FROM sys.server_principals sp WHERE sp.[sid] = 0x{SID_from_sys_asymmetric_keys}; -- remove the { and } 权限。

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