【问题标题】:Deploy CLR UDF in SQL Server 2017: procedure在 SQL Server 2017 中部署 CLR UDF:过程
【发布时间】:2019-08-19 08:07:01
【问题描述】:

我正在尝试按照https://sqlquantumleap.com/2017/08/09/sqlclr-vs-sql-server-2017-part-2-clr-strict-security-solution-1/ 中描述的过程在 SQL Server 2017 数据库中部署 CLR 程序集。基本上,出于测试目的,我只是包含了一个带有几个基于正则表达式的函数的程序集:

public class TextUdf
{
    [SqlFunction(Name = "RegexIsMatch", IsDeterministic = true, IsPrecise = true)]
    public static SqlBoolean RegexIsMatch(SqlString text, SqlString pattern,
        SqlInt32 options)
    {
        if (text.IsNull) return SqlBoolean.Null;
        if (pattern.IsNull) pattern = "";

        return Regex.IsMatch((string)text,
            (string)pattern,
            options.IsNull? RegexOptions.None : (RegexOptions)options.Value,
            new TimeSpan(0, 0, 10))
            ? SqlBoolean.True
            : SqlBoolean.False;
    }

    [SqlFunction(Name = "RegexReplace", IsDeterministic = true, IsPrecise = true)]
    public static SqlString RegexReplace(SqlString text, SqlString pattern,
        SqlString replacement, SqlInt32 options)
    {
        if (text.IsNull || pattern.IsNull) return text;

        return Regex.Replace((string)text, (string)pattern,
            (string)replacement,
            options.IsNull ? RegexOptions.None : (RegexOptions)options.Value);
    }
}

我在https://github.com/Myrmex/sqlclr 创建了一个完整的复制解决方案。我可以按照那里描述的整个过程(自述文件)直到我必​​须将 PFX 证书分配给要部署的 CLR 程序集。此时,我收到此错误:

MSB3325: Cannot import the following key file: pfx. The key file may be password protected. To correct this, try to import the certificate again or manually install the certificate to the Strong Name CSP with the following key container name: ...

按照错误信息的指导,我发现可以通过使用sn安装PFX来解决这个问题,这样我就可以在提示时手动输入密码(见Cannot import the keyfile 'blah.pfx' - error 'The keyfile may be password protected')。

完成此操作后,我可以使用 UDF 函数编译我的 CLR 程序集。现在,当我尝试通过CREATE ASSEMBLY [SqlServerUdf] FROM 0x...binary stuff... 将其安装到测试数据库(为此目的创建的只是一个空数据库)中时,我收到此错误:

CREATE or ALTER ASSEMBLY for assembly 'SqlServerUdf' with the SAFE or EXTERNAL_ACCESS option failed because the 'clr strict security' option of sp_configure is set to 1. Microsoft recommends that you sign the assembly with a certificate or asymmetric key that has a corresponding login with UNSAFE ASSEMBLY permission. Alternatively, you can trust the assembly using sp_add_trusted_assembly.

这违背了我必须遵循的漫长过程的目的,以便让 SQL Server 接受我的 CLR 而不会降低严格的安全性。

显然我遗漏了一些东西,但我不确定这个棘手程序的许多细节,所以这将是一个很难猜测的事情。谁能建议我们该过程有什么问题,以便我们可以快速而肮脏地一步一步地参考如何在 SQL Server 中插入 CLR 程序集?这个简单的任务似乎在最新版本中变得非常困难......

【问题讨论】:

  • 您是否在 SQL Server 中创建了证书并使用它进行了登录?参考:sqlshack.com/…(见选项 4)这帮助我解决了一个类似的问题(不过,我使用的是选项 3,所以我不能说这是一个多么好的解决方案)。
  • @Natfis:只是为了确认一下,您可以编译/签署SqlServerUdf 程序集吗?并且,您在尝试部署之前执行了 PreDeploy.sql 脚本,或者至少在 SqlServerUdf 项目中注册了 PreDeploy.sql 脚本?我相信我知道问题出在哪里,并将把其余的细节放在答案中。
  • @JasonWhitish SQLShack 页面还不错,但无助于创建自包含的部署脚本,也无助于将解决方案集成到完全与 Visual Studio 和/或自动化CI 过程。我的帖子中列出的选项——Asymmetric Key / snkCertificate-only——需要更多步骤,但会实现完全自动化:-D。

标签: c# sql-server sqlclr


【解决方案1】:

根据我在 GitHub 存储库中看到的内容,您似乎跳过了一些步骤:

  1. 您没有在原始 SQL2017_KeyAsm 项目上设置密码。这就是为什么它仍然是一个 .snk 文件(即 SQL2017_KeyAsm.snk)而不是一个 .pfx 文件(即 SQL2017_KeyAsm.pfx)。我猜你un选中了“用密码保护我的密钥文件”复选框(我认为它默认被选中),因为你不应该有 .snk一点也不。此外,在您的 SQL2017_KeyAsm.sqlproj 文件中,您目前拥有:

    <AssemblyOriginatorKeyFile>SQL2017_KeyAsm.snk</AssemblyOriginatorKeyFile>
    

    当你应该有以下情况:

    <AssemblyOriginatorKeyFile>SQL2017_KeyAsm.pfx</AssemblyOriginatorKeyFile>
    

    尽管您在自述文件中的说明是正确的,正如您在其中所述:“输入密码”。不过,这可能解释了您遇到的密码错误,因为没有密码保护私钥。要么,要么密码错误是由于使用了错误的 pfx 文件(见下文)。我想先尝试修复以下项目,因为它可能可以摆脱无密码 SNK,我只是从未尝试过。

  2. 一次性程序部分的末尾,在以“最后,以下步骤...”开头的段落之后的最后两个步骤中,第 2 步是使用了错误的 .pfx 文件。我猜这是上一步没有.pfx文件的直接结果(由于没有设置密码),所以你抓住了唯一的.pfx那里的文件。 是您在尝试加载 SqlServerUdf 程序集时遇到错误的原因:您使用 证书 对程序集进行了签名,但该证书只是用作将 KeyAsm 程序集加载到[master] 的机制,以便可以从中提取非对称密钥。之后证书被丢弃。非对称密钥是 .snk 文件的公钥,当您告诉 Visual Studio 您希望签署 SQL2017_KeyAsm 项目时创建该文件。因此,当您告诉 Visual Studio 对 进行签名时,您需要选择 .snk 文件(或SqlServerUdf 项目。这样做将使用相同的私钥对两个项目/程序集进行签名。

因此,首先要做的是更改用于签署 SqlServerUdf 程序集的私钥。它不应该是证书 .pfx 文件。它需要与用于签署 KeyAsm 文件的密钥相同。在您的情况下,这将是 SQL2017_KeyAsm.snk

尝试进行一项更改,看看是否一切正常。如果没有,则返回并在 snk 文件中添加密码(通过 Visual Studio)。您不需要重新生成证书或其 .pfx 文件,因为公钥应该保持不变,这就是加载到[master] 中的所有内容。但是,如果这仍然不起作用,请告诉我。同时,我将更新该帖子,以更明确地说明密码,以及何时使用哪个 pfx 文件。

【讨论】:

  • 谢谢,这一切都非常有用,我还必须检查您上面的链接。同时,也许只有我一个人,但我在 VS UI(当前使用 VS2019 RC4)中找不到任何“使用密码保护我的密钥文件”复选框。在 SQL CLR 选项中,我只找到了一个 Signing 按钮,当我点击它时,我会看到一个对话框,其中包含 Sign the assembly 复选框、带有 Change Password 按钮的 Choose a strong name key file 下拉列表和一个 Delay sign only 复选框。跨度>
  • 我还没有尝试过 VS 2019。也许我应该?但是我指的复选框是在您从该下拉列表中选择“新建...”时弹出的窗口中...
  • 谢谢,我不得不重复整个过程,但它确实有效。我已经更新了 GIT 存储库,以供我们所有凡人参考:)。
  • 太棒了!抱歉,这不是更清楚。我应该在今晚晚些时候更新我的帖子,并进行一些澄清。也请投票给Allow Asymmetric Key to be created from binary hex bytes string just like CREATE CERTIFICATE,因为它可以消除 90%(或更多)的麻烦!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
相关资源
最近更新 更多