【问题标题】:Avoiding TRUSTWORTHY ON and PERMISSION_SET = UNSAFE using System.Net.Http使用 System.Net.Http 避免 TRUSTWORTHY ON 和 PERMISSION_SET = UNSAFE
【发布时间】:2018-05-25 21:07:27
【问题描述】:

尝试从我构建的 DLL 创建一个存储过程,以使用 CLR 集成与 SQL 一起使用。我想我需要一个签名版本的 System.Net.Http 并在下面解释原因。任何建议或提示将不胜感激。

如果我使用命令,解决方案 100% 有效

ALTER DATABASE test2 SET TRUSTWORTHY ON

然后我使用以下命令创建程序集

CREATE ASSEMBLY [System.Net.Http]
AUTHORIZATION dbo
FROM 'C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Net.Http\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Net.Http.dll'
WITH PERMISSION_SET = UNSAFE;
GO 

CREATE ASSEMBLY [CLRTest01]
AUTHORIZATION dbo
FROM 'C:\Windows\CLRTest01.dll'
WITH PERMISSION_SET = UNSAFE;
GO 

由于我选择信任默认设置,因此我希望能够在不使用权限级别“不安全”的情况下执行此操作,而是使用“安全”。但是,当我尝试为依赖于 System.Net.Http 的 CLRTest01 执行此操作时,我遇到了 System.Net.Http 未签名或格式错误的问题。

CREATE ASSEMBLY [System.Net.Http]
AUTHORIZATION dbo
FROM 'C:\Windows\System.Net.Http.dll'
WITH PERMISSION_SET = SAFE;
GO 

使用 v4.0_2.0.0.0__b03f5f7f11d50a3a 时出错 - 无法安装程序集“System.Net.Http”,因为现有策略会阻止它被使用。

使用 v4.0_4.0.0.0__b03f5f7f11d50a3a 时出错 - CREATE ASSEMBLY 失败,因为安全程序集“System.Net.Http”中的类型“System.Net.Http.HttpContent”有一个静态字段“EncodingsWithBom”。安全程序集中静态字段的属性必须在 Visual C# 中标记为只读,在 Visual Basic 中标记为只读,在 Visual C++ 和中间语言中标记为 initonly。

这让我相信我需要一个签名版本的 System.Net.Http

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?是否可以改用HttpWebRequest?这至少已经是 SQL Server 的 CLR 主机的一部分。此外,您可能应该从原始位置添加程序集,而不是直接从 GAC 中添加。

标签: c# .net sql-server security sqlclr


【解决方案1】:

所有 .NET Framework 库都已签名。问题是您需要使用用于签署该程序集的强名称密钥 (SNK) 或证书 (CER) 的公钥在 [master] 中创建一个非对称密钥或证书(通常程序集既是强命名并且用证书签名)。

您可以执行以下操作来避免TRUSTWORTHY (which is absolutely the right thing to do):

USE [master];

CREATE CERTIFICATE [MS.NETcer]
FROM EXECUTABLE FILE =
   'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Net.Http.dll';

CREATE LOGIN [MS.NETcer] FROM CERTIFICATE [MS.NETcer];

GRANT UNSAFE ASSEMBLY TO [MS.NETcer];

那么你可以这样做:

USE [SomeDatabase];

CREATE ASSEMBLY [System.Net.Http]
FROM 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Net.Http.dll'
WITH PERMISSION_SET = UNSAFE;

除此之外,由于您发布的错误消息,您将无法将 PERMISSION_SET = SAFESystem.Net.Http 一起使用:

在安全程序集“System.Net.Http”中键入“System.Net.Http.HttpContent”有一个静态字段“EncodingsWithBom”。安全程序集中静态字段的属性必须在 Visual C# 中标记为只读,在 Visual Basic 中标记为只读,在 Visual C++ 和中间语言中标记为 initonly。

由于您无法将该静态字段标记为 readonly 并重新编译,因此您只能使用 UNSAFE

有关一般使用 SQLCLR 的更多信息(包括设置 Visual Studio 以处理证书签名,甚至在 SQL Server 2017 中工作的说明,这比以前的版本更严格):

SQLCLR.org

【讨论】:

  • 感谢这有助于安装 System.Net.Http。现在让我的自定义 DLL 依赖它来工作。
  • @LINQtothepast 自定义 DLL 需要使用证书进行签名,将该证书的公钥(.cer 文件)加载到 master DB 中,从该证书创建登录,并授予登录UNSAFE ASSEMBLY 许可。请访问 SQLCLR.org 获取如何执行此操作的链接,包括在 Visual Studio 中自动化(可以在我的博客上找到说明,链接在该站点或此处:SQLCLR vs. SQL Server 2017, Part 2: “CLR strict security” – Solution 1 或第 3 部分)。
猜你喜欢
  • 2015-08-20
  • 2011-06-10
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2020-04-06
  • 2015-01-29
  • 2012-05-02
  • 1970-01-01
相关资源
最近更新 更多