如何对我正在使用的不安全的 C# CLR 和程序集进行签名,而不是将数据库放在可信的位置上

Eun*_*ris 5 .net c# unsafe sqlclr visual-studio

我在我的 C# CLR 代码中使用 .NET DirectoryServices 和 DirectoryServices.AccountManagement。我想发布到我的 SQL Server 数据库作为一个不安全的 CLR 存储过程。在 Visual Studio 中,我签署了我的 CLR 项目。我想避免打开“值得信赖”。我还如何签署程序集?我知道这听起来很简单,但我在谷歌上搜索了 4 个小时却没有找到答案。当我将 Stairway 下载到 CLR 时,我以为我已经很接近了,但在那里找不到答案。

Sol*_*zky 5

首先:感谢您没有走简单的路线并启用TRUSTWORTHY. 严重地。正确地做到这一点并没有那么多工作,所以我(和你的雇主)感谢你做更多的研究,当你无法进一步研究时,请寻求帮助。

如果您指的是SQL Server Central 上的“ SQLCLR 的阶梯”系列,那么我就是这些文章的作者。如果信息不容易理解,我很抱歉。我将在这里概述步骤:

  1. 在 Visual Studio 中,使用强名称密钥对程序集进行签名,并使用密码保护它(根据问题,您已经这样做了)
  2. 根据您正在做什么和总体要求,您可以在此处进行一些选择:

    1. 如果您的程序集使用的代码在通过 CREATE ASSEMBLY 创建时确实标记了验证步骤中的违规行为,那么您可以从技术上将程序集加载到 中[master],标记为SAFE,以从中创建非对称密钥(您不会在此处执行代码所以它不需要UNSAFE在这里标记)。
    2. 如果您的代码未通过验证(意思是:它只能在标记为 时创建UNSAFE),那么我发现最好创建一个单独的空程序集,并使用相同的强名称密钥文件(即.pfx文件)签名用于主大会。然后我加载那个,空的但签名的,Assembly into [master],标记为SAFE
    3. 如果您需要处理 SQL Server 2017,那么这需要一个额外的步骤,我稍后会提到。
  3. 一旦您创建[master]了一个.pfx程序集,并使用用于签署主程序UNSAFE集的相同文件进行签名,然后您可以简单地[master]从该程序集中创建一个非对称密钥。

  4. 从该非对称密钥创建登录

  5. 授予基于密钥的登录UNSAFE ASSEMBLY权限

这些步骤适用于 SQL Server 2005 - 2016,我提供了有关如何在 Visual Studio 中的Stairway to SQLCLR 级别 7:开发和安全文章中自动执行此操作(上面的选项 2 - 使用单独的、空的、已签名的程序集)的说明。(顺便说一句,我确实意识到第 7 级中描述的步骤确实有点多,但它们确实提供了一种使用 Visual Studio 的自动化方法,并且可以通过使用 T4 模板(VS 随附)来简化它们——但我没有还没有时间写出简化的方法——不过希望很快)。

但是,如果您需要考虑 SQL Server 2017(或更新的,大概),那么上述步骤将不起作用,因为即使SAFE没有签名并且具有相应的基于签名的具有UNSAFE ASSEMBLY权限的登录,也无法再创建程序集。而且,不幸的是,CREATE ASYMMETRIC KEY不允许从十六进制字节字符串/VARBINARY文字创建,因此您需要使用允许以这种方式创建的证书。沿着这些思路,我有两篇博客文章详细介绍了如何通过 Visual Studio(甚至不使用 Visual Studio)完全自动化地实现这一点:

无论您做什么,都不要上当使用 SQL Server 2017 的新“可信程序集”功能,因为它存在许多问题,如下所述:SQLCLR 与 SQL Server 2017,第 4 部分:“可信程序集”——失望还有一篇我现在正在处理的帖子。

为了帮助改进这个不必要的痛苦过程,请支持我改进CREATE ASYMMETRIC KEY和 SSDT 的增强请求: