【问题标题】:asymmetric key creation over network通过网络创建非对称密钥
【发布时间】:2025-12-07 08:45:01
【问题描述】:

我正在尝试使用asymmetric keyadd an assembly 到 SQL2008 中的数据库。

我们使用十六进制字符串添加程序集(仅通过 sql 查询将程序集添加到服务器)

USE [master] 
GO

IF NOT EXISTS (SELECT * from sys.asymmetric_keys where name = 'ManagedAsymmetricKey')
 BEGIN
  CREATE ASYMMETRIC KEY ManagedAsymmetricKey FROM FILE = 'C:\Managed.dll'
  CREATE LOGIN CLRLogin FROM ASYMMETRIC KEY ManagedAsymmetricKey
  GRANT UNSAFE ASSEMBLY TO CLRLogin
 END
GO

USE [$dbName]
GO
CREATE ASSEMBLY [Managed]
AUTHORIZATION [dbo]
FROM 0x4D5A....
WITH PERMISSION_SET = UNSAFE
GO

这将在本地实例上运行,但是通过我们收到的网络; The certificate, asymmetric key, or private key file does not exist or has invalid format.

我可能错误地假设我应该首先添加密钥,我应该添加程序集然后按照CREATE ASYMMETRIC KEY ManagedAsymmetricKey FROM ASSEMBLY [workingDB].[dbo].[Managed] 的方式做一些事情吗?

【问题讨论】:

    标签: sql-server sql-server-2008 assemblies public-key


    【解决方案1】:

    FROM FILE = 始终来自 SQL Server 的角度。您应该将证书复制到数据库服务器上的本地驱动器。

    【讨论】:

      【解决方案2】:

      您可以使用以下步骤使其正常工作:

      • 使用 SAFE 权限集运行您的创建程序集语句(即使程序集需要 UNSAFE 执行)
      • 从程序集创建非对称密钥
      • 放下你的程序集
      • 使用非对称密钥创建登录
      • 授予登录不安全的汇编权限

        CREATE ASSEMBLY [Managed]
        AUTHORIZATION [dbo]
        FROM 0x4D5A....
        WITH PERMISSION_SET = SAFE
        
        CREATE ASYMMETRIC KEY ManagedAsymmetricKey FROM ASSEMBLY [Managed]
        
        DROP ASSEMBLY [Managed]
        
        CREATE LOGIN CLRLogin FROM ASYMMETRIC KEY ManagedAsymmetricKey
        
        GRANT UNSAFE ASSEMBLY TO CLRLogin
        

      【讨论】:

      • 对于临时程序集,您不需要将PERMISSION_SET 设置为UNSAFE,因为您不需要执行程序集中的代码来创建密钥。这也意味着您不必在任何地方设置TRUSTWORTHY。除此之外,感谢您的聪明破解!
      • 我把 unsafe 因为问题中的程序集是不安全的。如果你有一个安全的组装,这确实是不需要的。
      • 对此我不是 100%,但我不认为程序集本质上是(不)安全的。我的程序集包含仅使用UNSAFE 权限运行的代码,但是当我使用PERMISSION_SET = SAFE 创建程序集时,SQL Server 不会抱怨。
      • 所以即使程序集只有SAFE 权限,CREATE ASYMMETRIC KEY 也可以工作。之后,您可以使用非对称密钥(和关联的登录名)将权限集更改为UNSAFE。我已经对其进行了测试,它对我有用。我不需要让主数据库值得信赖。
      • 我根据 SAFE permission_set 方法更新了脚本
      最近更新 更多