AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 300601
Accepted
Kris
Kris
Asked: 2021-10-05 09:41:30 +0800 CST2021-10-05 09:41:30 +0800 CST 2021-10-05 09:41:30 +0800 CST

从 SQL Server 中的证书加载程序集

  • 772

我们收到了来自外部供应商的组件

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>

  1. 已下载 Visual Studio 社区版 2019
  2. 从上面的一组文件中,打开工程文件
  3. 构建 CALC 项目
  4. 它创建了一个 .dll 文件
  5. 在项目的属性中,签名选项卡 签约 创建了一个新的强名称密钥文件**没有选中复选框“使用密码保护我的密钥文件”并选择 sha256RSA 作为签名算法保存项目并构建,它会创建一个 .snk文件
  6. 将 DLL 和 snk 文件复制到 SQL Server 框
  7. 运行以下脚本
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

sql-server sql-server-2016
  • 1 1 个回答
  • 306 Views

1 个回答

  • Voted
  1. Best Answer
    Solomon Rutzky
    2021-10-05T14:42:48+08:002021-10-05T14:42:48+08:00

    鉴于您收到的是脚本化程序集而不是 DLL(我们目前知道,开发人员不太友好地对其进行签名),因此在操作系统级别上签名将不是一件容易的事(首选方法),因为您首先需要从该程序集中创建一个真正的二进制文件(有一些方法,只是没有内置到 Windows 中)。

    因此,在这种情况下,您可以做下一件最好的事情,即在 SQL Server 中对程序集进行签名。步骤是:

    1. TRUSTWORTHY为将加载程序集的数据库启用(这是临时的!)

    2. 运行脚本以加载程序集

    3. 禁用TRUSTWORTHY

    4. 在加载程序集的数据库中创建证书(使用CREATE CERTIFICATE)

      CREATE CERTIFICATE [{cert_name}]
         ENCRYPTION BY PASSWORD = '{password}'
         WITH SUBJECT = 'Allow assembly to be loaded',
         EXPIRY_DATE = '20991031';  
      
    5. 使用签名程序集ADD SIGNATURE

      ADD SIGNATURE TO ASSEMBLY::[MYCALC_DLL]
         BY CERTIFICATE [{cert_name}]
         WITH PASSWORD = '{password}';
      
    6. 将证书复制到[master](仅限公钥)

    7. 从该证书创建登录

    8. 授予该登录UNSAFE ASSEMBLY权限(以下代码处理最后 3 个步骤)

      DECLARE @Cert NVARCHAR(MAX);
      SET @Cert = CONVERT(NVARCHAR(MAX), CERTENCODED(CERT_ID(N'ObjectSigner')), 1);
      
      EXEC (N'USE [master]
      CREATE CERTIFICATE [{cert_name}]
      FROM BINARY = ' + @Cert + N';
      
      CREATE LOGIN [{cert_name}]
         FROM CERTIFICATE [{cert_name}];
      
      GRANT UNSAFE ASSEMBLY TO [{cert_name}];');
      

    现在一切都应该没问题。

    笔记

    1. 如果您有实际的 DLL 二进制文件在操作系统级别进行签名,则您只需要makecert.exe、pvk2pfk.exe和signtool.exe 。其中之一应该已经存在于您的机器上(即使不在 PATH 中),我相信它是signtool。

    2. 您可以从 Windows SDK 中获取其他两个实用程序(我将很快发布一篇文章,其中包含指向位置的链接以及要获取哪些特定包,这样就不需要全部获取它们)。

    3. TRUSTWORTHY并且UNSAFE是两个非常不同的东西。启用TRUSTWORTHY是一种广泛的方法,例如使用模拟(即EXECUTE AS),因为它并不特定于它所授予的内容。

    4. !!现在,这个程序集的开发者实际上可能做了强名称和/或签名。完成上述步骤以加载程序集后,您可以通过尝试从中创建非对称密钥和证书来检查它是否已签名。如果其中任何一个工作,那么您可能有更多选项来再次加载此程序集,特别是如果它已使用证书签名(将来,如果您可以要求开发人员对其进行签名,那将是理想的)。您可以通过以下方式尝试:

      CREATE ASYMMETRIC KEY [_test_key] FROM ASSEMBLY [MYCALC_DLL];
      
      CREATE CERTIFICATE [_test_cert] FROM ASSEMBLY [MYCALC_DLL];
      

    回复:问题中添加了新代码

    我不确定您是否节省了开发人员向您发送所有项目文件的时间或精力(向您发送强命名的 DLL 二进制文件会容易得多),但基于您在问题中添加的内容:

    1. 在 Visual Studio 中打开时,我会打开解决方案文件(即.sln)而不是项目文件(即.*proj)。
    2. 有趣的是它是一个.csproj文件而不是一个.sqlproj文件,但如果它有效,那么它就有效。
    3. 在 Visual Studio 中的“签名”选项卡上:我从未尝试过不使用密码保护 SNK 文件,但我认为它应该仍然可以工作,因为它只是保护私钥,但导入 SQL 时只需要公钥服务器。
    4. 您不需要将.snk文件复制到 SQL Server 计算机,因为它不会被使用。可以从.snk文件加载到 SQL Server的公钥也在强命名/签名的 DLL 本身中,因此您只需要 DLL(您已经根据脚本创建了非对称密钥)显示在问题中)。
    5. 无需在其中创建用户,[target_database]因为它不会被使用或不需要使用。目前,它没有被使用,因此可以跳过该步骤。
    6. 创建程序集:我会PERMISSION_SET = SAFE先看看它是否有效。如果是这样,那就坚持下去。如果您在创建程序集时遇到错误,请尝试UNSAFE. 如果SAFE适用于加载程序集但随后执行 proc 得到权限错误(文件系统很可能给出了某些源代码文件的名称),则将程序集更改为具有PERMISSION_SET = EXTERNAL_ACCESS而不是SAFE.
    7. 不确定该CREATE PROCEDURE声明是否完整或已编辑,但该AS EXTERNAL NAME部分不完整。您目前只有程序集名称,,DBCALC_DLL当您还需要您正在调用的方法所在的类的名称,然后是您正在调用的方法的名称(例如DBCALC_DLL.class.method)时。
    8. 只是出于好奇,为什么将其称为“PROC”,即使名称中有“_SP”,但它是一个函数??
    • 2

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve