从旧版用于 Microsoft Azure Key Vault 的 SQL Server 连接器还原备份时出现错误 33111

原始 KB 数: 4470999

本文讨论尝试还原使用旧版 SQL Server 连接器Microsoft Azure 密钥库的服务器上的透明数据加密(TDE)备份时发生的错误。

现象

尝试从使用 SQL Server Connector 密钥库 1.0.4.0 或更低版本的 SQL Server 还原数据库备份以用于 Microsoft Azure Key Vault 的 SQL Server 连接器 1.0.5.0 时遇到问题。

假设部署以下 Microsoft SQL Server 实例:

  • SQL Server 实例sql1部署了 密钥库 1.0.4.0 的 SQL Server 连接器。

  • SQL Server 实例sql2部署了 密钥库 1.0.5.0 的 SQL Server 连接器。

  • 使用以下查询在密钥库中从同一非对称密钥源和实例上sql1sql2部署非对称密钥:

    CREATE ASYMMETRIC KEY TDE_KEY 
    FROM PROVIDER AzureKeyVaultProvider 
    WITH PROVIDER_KEY_NAME = 'key1', 
    CREATION_DISPOSITION = OPEN_EXISTING
    

如果查看两台服务器上的指纹值,你会注意到指纹长度不同,尽管它们是从同一源创建的。 版本 1.0.5.0 指纹长于版本 1.0.4.0。

1.0.4.0 指纹的示例:

0x2C5677D76F76D77F80

1.0.5.0 指纹的示例:

0x373B314B78E8D59A0925494558FEF14B726216C5

更改会导致备份和还原操作期间出现问题。

示例:

你有一个数据库备份,该备份由实例中密钥库中的sql1非对称密钥加密。

实例 sql2 已创建非对称密钥。

如果尝试在实例上 sql2 还原备份,操作将失败,并返回类似于以下消息的错误消息:

Msg 33111、Level 16、State 4、LineNumber <>

找不到指纹为“0x2C5677D76F76D77F80”的服务器非对称密钥。

注意:

检索每个密钥指纹的查询如下所示:

SELECT thumbprint, * FROM master.sys.asymmetric_keys

检索每个 TDE 数据库的指纹的查询如下所示:

SELECT DatabaseName(ddek.database_id) AS DatabaseName, ak.name
AS [Asymmetric key Name], ak.thumbprint FROM
sys.dm_database_encryption_keys ddek INNER JOIN
master.sys.asymmetric_keys ak ON
ak.thumbprint = ddek.encryptor_thumbprint

原因

SQL Server Connector 版本 1.0.5.0 中引入了更新,用于密钥库更改程序计算指纹的方式。 在版本 1.0.5.0 中,此计算与程序引擎用于支持以下迁移方案的逻辑匹配:

来源:使用可扩展密钥管理的本地Microsoft SQL Server (EKM)

若要:Microsoft Azure SQL 数据库使用“自带密钥”(BYOK)支持透明数据加密(TDE)

由于此更改,尝试从版本 1.0.4.0 或更低版本还原数据库备份时可能会遇到问题。

解决方法

  1. 将适用于 密钥库 1.0.4.0 或更低版本的 SQL Server 连接器复制到sql2实例服务器。

  2. sql2 服务器上运行以下查询以更改为 CRYPTOGRAPHIC PROVIDER 版本 1.0.4.0:

    ALTER CRYPTOGRAPHIC PROVIDER AzureKeyVaultProvider
    FROM FILE =
    'FilePath\FileName\SQL Server Connector for Microsoft Azure Key Vault\1.0.4.0\Microsoft.AzureKeyVaultService.EKM.dll'
    
    1. 请重新启动 SQL Server。

    2. 使用 CRYPTOGRAPHIC PROVIDER 1.0.4.0 创建新的非对称密钥。

        CREATE ASYMMETRIC KEY TDE_KEY_1040 
        FROM PROVIDER AzureKeyVaultProvider 
        WITH PROVIDER_KEY_NAME = 'key1', 
        CREATION_DISPOSITION = OPEN_EXISTING
      
  3. 可以使用以下查询确认这两个非对称密钥是否存在:

    SELECT thumbprint,* FROM master.sys.asymmetric_keys
    
  4. 使用类似于以下查询的查询将凭据添加到非对称密钥映射登录名(以下示例中的TDE_Login):

    ALTER LOGIN [Contoso\DomainUser] DROP CREDENTIAL sysadmin_ekm_cred; 
    ALTER LOGIN TDE_Login ADD CREDENTIAL sysadmin_ekm_cred;
    
  5. 现在应该能够还原备份。

  6. 运行以下查询 sql2 以还原 CRYPTOGRAPHIC PROVIDER 到版本 1.0.5.0:

    ALTER CRYPTOGRAPHIC PROVIDER AzureKeyVaultProvider 
    FROM FILE =
    'FilePath\FileName\SQL Server Connector for Microsoft Azure Key Vault\1.0.5.0\Microsoft.AzureKeyVaultService.EKM.dll'
    
  7. 请重新启动 SQL Server。

  8. 若要使用新的指纹,请使用相同的非对称密钥或新版本非对称密钥运行以下查询。

    ALTER DATABASE ENCRYPTION KEY
    ENCRYPTION BY SERVER ASYMMETRIC KEY <KeyName_1.0.5.0_version>