【问题标题】:Creating asymmetric keys in SQL Server 2014 for unsafe assemblies在 SQL Server 2014 中为不安全的程序集创建非对称密钥
【发布时间】:2018-04-28 05:52:04
【问题描述】:

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

我收到第二个错误:

消息 10327,第 14 层,状态 1,第 27 行
为程序集“TableFile”创建程序集失败,因为程序集“TableFile”未获得 PERMISSION_SET = UNSAFE 的授权。当以下任一情况为真时,程序集被授权:数据库所有者 (DBO) 具有 UNSAFE ASSEMBLY 权限并且数据库具有 TRUSTWORTHY 数据库属性;或者该程序集使用证书或非对称密钥签名,该证书或非对称密钥具有相应的登录名并具有 UNSAFE ASSEMBLY 权限。

我无法询问前任员工,那么我该如何了解如何让它运行?我也试过这个:

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

这会产生以下错误:

消息 15396,第 16 级,状态 1,第 9 行
名称为“AProjectKey”的非对称密钥已存在或该非对称密钥已添加到数据库中。

消息 15151,第 16 级,状态 1,第 10 行
找不到非对称密钥“AProjectKey”,因为它不存在或您没有权限。

消息 15151,第 16 级,状态 1,第 11 行
找不到登录“AProjectLogin”,因为它不存在或您没有权限。

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

【问题讨论】:

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


    【解决方案1】:

    关于那些3个的错误消息:

    1. 在第一可能是由于非对称密钥已经存在,但以不同的名称。密钥和证书必须是唯一的在他们的公钥而言,不只是名称(尽管这显然必须是唯一的为好)。每个密钥和证书具有被称为“指纹”的公共密钥的哈希值。现有的密钥的指纹/证书时创建一个新的,将防止创建,即使经历了不同的命名密钥/证书如果指纹已存在检查。这就是通过“或该非对称密钥已经被添加到数据库中。” P>的错误消息的装置

      或者:

      这可能意味着一个不同的非对称密钥(即不同的“指纹”)存在于master,但与名AProjectKey P>

    2. 因为你无法创建一个不同的名称相同的密钥,没有非对称密钥存在与新的名字,因此你不能用它创建一个登录(因为,同样,CREATE ASYMMETRIC KEY语句失败)。
    3. 因为你无法创建登录,它不存在被授予任何权限。

    错误#2有助于缩小问题。如果错误#1所致现有的具有非对称密钥的名称相同,但不同的“指纹”,那么你要么就已经能够创建登录(如果它不存在),或者你会得到一个错误,指出登录(即“服务器主体”)已经存在。但错误的是,非对称密钥通过的名称 em>的无法找到。这应该意味着非对称密钥本身已经存在,但以不同的名称。你可以看到通过执行以下哪些非对称密钥已创建: P>

    SELECT * FROM sys.asymmetric_keys;
    

    但是,这并不告诉你哪一个从大会(或签署大会以相同的强名称密钥用于签署此一个)来了。对于那些你需要知道的“指纹”,为此,你需要打开一个命令提示符(最好是“开发人员命令提示符”安装的时候,因为它有正确的路径设置在打开它的Visual Studio的设置)。然后,运行以下内容:

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

    您应该看到: P>

    Public key token is XXXXXXXXXXXXXXXX
    

    复制并粘贴XXXXX“令牌”(即指纹)转换成以下查询:

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

    假设你得到一个返回行,我们需要看是否存在登录。只是试图从非对称密钥创建一个登录不会得到我们的登录名,如果它确实存在,因为你只能有1登录每个密钥/证书创建,以及错误消息只报告回你要创建的名称已经存在,尽管它可以是同一个密钥不同的名称之一。因此,从返回的行走SID,并将其粘贴在以下查询:

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

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

    在这一点上应登录存在,因此授予它UNSAFE ASSEMBLY权限。 P>

    现在重新尝试创建大会。 P>

    【讨论】:

    • 全搞掂我的问题! SPAN>
    • @ cdub真棒!是登录缺失,或者是它那里,只是需要的权限? SPAN>
    • 登录在那里它只是需要的许可。跨度>
    • @ cdub感谢澄清。我问部分,因为它是可以登录确实有EXTERNAL ACCESS ASSEMBLY权限,但不允许UNSAFE组件。 SPAN>
    猜你喜欢
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2015-04-11
    • 2017-12-26
    • 1970-01-01
    • 2018-08-24
    • 2014-08-23
    • 2013-02-12
    相关资源
    最近更新 更多