我们收到了来自外部供应商的组件
CREATE ASSEMBLY MYCALC_DLL
AUTHORIZATION dbo
FROM 0x42A728....<300,000 binary values>
WITH PERMISSION_SET = UNSAFE
GO
这个 DLL 是从 SP 调用的。
我们不想为数据库设置 TRUSTWORTHY ON 以将此程序集加载到 SQL Server DB 中,并且正在探索选项。遇到这些链接
https://nielsberglund.com/2017/07/01/sqlclr-and-certificates/
https://sqlquantumleap.com/2017/08/09/sqlclr-vs-sql-server-2017-part- 2-clr-strict-security-solution-1/
https://sqlquantumleap.com/2017/08/16/sqlclr-vs-sql-server-2017-part-3-clr-strict-security-solution-2/
然而,这些链接使用的工具如 MAKECERT(由 new-selfsignedcertificate 代替)、pvk2pfx.exe 和 signtool.exe 在我们的 win2016 服务器上不存在。
也可以用这种方法调用 DLL
在数据库中启用 TRUSTWORTHY -> 在数据库中安装程序集 AS WITH PERMISSION_SET = UNSAFE-> 在数据库中禁用 TRUSTWORTHY
我想这是一个愚蠢的问题,但是我将程序集加载为不安全,那么禁用 TRUSTWORTHY 有什么意义呢?纠正我...
我们想使用证书。如何进一步进行?并且这些数据库将很快配置为 AlwaysOn,会有任何并发症吗?谢谢
-----它是这样工作的。这是正确的方法吗?--------
<这是我第一次使用VS>
- 已下载 Visual Studio 社区版 2019
- 从上面的一组文件中,打开工程文件
- 构建 CALC 项目
- 它创建了一个 .dll 文件
- 在项目的属性中,签名选项卡 创建了一个新的强名称密钥文件**没有选中复选框“使用密码保护我的密钥文件”并选择 sha256RSA 作为签名算法保存项目并构建,它会创建一个 .snk文件
- 将 DLL 和 snk 文件复制到 SQL Server 框
- 运行以下脚本
USE [Master]
GO
CREATE ASYMMETRIC KEY CLR_SP_Key
FROM EXECUTABLE FILE = 'H:\CLR_SP\CALC.dll'
GO
CREATE LOGIN CLR_SP_Login FROM ASYMMETRIC KEY CLR_SP_Key
GO
GRANT UNSAFE ASSEMBLY TO CLR_SP_Login
GO
USE [target_database]
GO
CREATE USER CLR_SP_Login FOR LOGIN CLR_SP_Login
GO
CREATE ASSEMBLY DBCALC_DLL FROM 'H:\CLR_SP\CALC.dll'
WITH PERMISSION_SET=UNSAFE
GO
CREATE function dbo.Proc_CLR_SP
(
@name as nvarchar(200) ,
@name2 as nvarchar(200)
)
RETURNS nvarchar(200)
AS EXTERNAL NAME DBCALC_DLL
鉴于您收到的是脚本化程序集而不是 DLL(我们目前知道,开发人员不太友好地对其进行签名),因此在操作系统级别上签名将不是一件容易的事(首选方法),因为您首先需要从该程序集中创建一个真正的二进制文件(有一些方法,只是没有内置到 Windows 中)。
因此,在这种情况下,您可以做下一件最好的事情,即在 SQL Server 中对程序集进行签名。步骤是:
TRUSTWORTHY
为将加载程序集的数据库启用(这是临时的!)运行脚本以加载程序集
禁用
TRUSTWORTHY
在加载程序集的数据库中创建证书(使用
CREATE CERTIFICATE
)使用签名程序集
ADD SIGNATURE
将证书复制到
[master]
(仅限公钥)从该证书创建登录
授予该登录
UNSAFE ASSEMBLY
权限(以下代码处理最后 3 个步骤)现在一切都应该没问题。
笔记
如果您有实际的 DLL 二进制文件在操作系统级别进行签名,则您只需要makecert.exe、pvk2pfk.exe和signtool.exe 。其中之一应该已经存在于您的机器上(即使不在 PATH 中),我相信它是signtool。
您可以从 Windows SDK 中获取其他两个实用程序(我将很快发布一篇文章,其中包含指向位置的链接以及要获取哪些特定包,这样就不需要全部获取它们)。
TRUSTWORTHY
并且UNSAFE
是两个非常不同的东西。启用TRUSTWORTHY
是一种广泛的方法,例如使用模拟(即EXECUTE AS
),因为它并不特定于它所授予的内容。!!现在,这个程序集的开发者实际上可能做了强名称和/或签名。完成上述步骤以加载程序集后,您可以通过尝试从中创建非对称密钥和证书来检查它是否已签名。如果其中任何一个工作,那么您可能有更多选项来再次加载此程序集,特别是如果它已使用证书签名(将来,如果您可以要求开发人员对其进行签名,那将是理想的)。您可以通过以下方式尝试:
回复:问题中添加了新代码
我不确定您是否节省了开发人员向您发送所有项目文件的时间或精力(向您发送强命名的 DLL 二进制文件会容易得多),但基于您在问题中添加的内容:
[target_database]
因为它不会被使用或不需要使用。目前,它没有被使用,因此可以跳过该步骤。PERMISSION_SET = SAFE
先看看它是否有效。如果是这样,那就坚持下去。如果您在创建程序集时遇到错误,请尝试UNSAFE
. 如果SAFE
适用于加载程序集但随后执行 proc 得到权限错误(文件系统很可能给出了某些源代码文件的名称),则将程序集更改为具有PERMISSION_SET = EXTERNAL_ACCESS
而不是SAFE
.CREATE PROCEDURE
声明是否完整或已编辑,但该AS EXTERNAL NAME
部分不完整。您目前只有程序集名称,,DBCALC_DLL
当您还需要您正在调用的方法所在的类的名称,然后是您正在调用的方法的名称(例如DBCALC_DLL.class.method
)时。