物理服务器切换时 SQL Server 2008 打开主密钥错误

Posted

技术标签:

【中文标题】物理服务器切换时 SQL Server 2008 打开主密钥错误【英文标题】:SQL Server 2008 Open Master Key error upon physical server change over 【发布时间】:2011-01-02 08:05:19 【问题描述】:

我将 SQL Server 数据库从一个系统复制到下一个系统,设置相同,但物理机完全不同。我使用 Norton Ghost 并手动恢复了文件,例如重新安装 SQL Server 2008 Express 后在 c:\Program Files 中找到的整个 SQL Server 2008 文件夹。

我的一个数据库在它的多个表、列上启用了 AES_256 加密。我重置了我的 IIS7 并尝试运行访问数据库的应用程序,在检索数据时,我收到此错误:

“/”应用程序中的服务器错误。 请在 数据库或打开主密钥 执行此操作之前的会话 手术。描述:一个未处理的 期间发生异常 执行当前的 Web 请求。 请查看堆栈跟踪以获取更多信息 有关错误和位置的信息 它起源于代码。

异常详情: System.Data.SqlClient.SqlException: 请在 数据库或打开主密钥 执行此操作之前的会话 操作。

来源错误:

产生了一个未处理的异常 在当前执行期间 网络请求。有关的信息 异常的起源和位置 可以使用异常识别 下面的堆栈跟踪。

我已经阅读并找到了一些关于 AES 加密如何与机器密钥相关联的链接,但不知道如何将其复制到新系统。或者甚至可能并非如此。

注意:我已尝试删除对称密钥、证书和主密钥并重新创建它们。这消除了错误,但是通过 AES_256 加密的数据没有显示出来。但是,未加密的列会。

任何帮助将不胜感激。提前致谢!

【问题讨论】:

【参考方案1】:

数据库主密钥使用服务器主密钥加密,该密钥特定于安装 SQL Server 的计算机。当您将数据库移动到另一台服务器时,您将失去自动解密和打开数据库主密钥的能力,因为本地服务器密钥很可能不同。如果您无法解密数据库主密钥,则无法解密依赖它的任何其他内容(证书、对称密钥等)。

基本上,您希望根据新的服务器密钥重新加密数据库主密钥,这可以使用此脚本完成(使用管理员权限):

-- Reset database master key for server (if database was restored from backups on another server)
OPEN MASTER KEY DECRYPTION BY PASSWORD = '---your database master key password---'
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
GO

请注意,当您创建数据库主密钥时,您还应始终提供密码,以便在无法使用服务主密钥的情况下使用该密码打开密钥 - 希望您已获得该密码存储在某个地方!

或者,您可以恢复数据库主密钥的备份 - 但您需要为目标服务器而不是源服务器创建的备份。

如果您没有备份或密码,那么我不确定您是否能够在新服务器上恢复加密数据,因为您必须删除并重新创建数据库主密钥新密码,这将杀死所有相关的密钥和数据。

【讨论】:

天哪!你是我的救星!如果我可以点击那个向上箭头一千次,我会的!非常感谢!【参考方案2】:

我刚刚遇到了类似的情况,在操作系统驱动器死后重建服务器。我重新安装了 SQL 并将其重新连接到未触及数据驱动器上的所有旧数据库。除了我的加密列之外,一切正常。但我的问题是主服务密钥被冲洗掉了。我能够通过返回移动之前作为我的 SQL Server 服务帐户的相同的域凭据来修复我的主服务密钥。

这个article 给了我修复(感谢Matt Bowler 他出色的文章)。我知道本地机器密钥已更改,但我的救赎是我可以使用相同的服务帐户。

服务主密钥:密钥层次结构的顶部是服务主密钥。每个 SQL Server 实例都有一个,它是一个对称密钥,存储在主数据库中。用于加密在第一次 SQL Server 启动时生成的数据库主密钥、链接服务器密码和凭据。

没有与此密钥关联的用户可配置密码 - 它由 SQL Server 服务帐户和本地计算机密钥加密。在启动时,SQL Server 可以使用这些解密中的任何一个打开服务主密钥。如果其中一个失败 - SQL Server 将使用另一个并“修复”失败的解密(如果两者都失败 - SQL Server 将出错)。这是为了解决故障转移后本地机器密钥不同的集群等情况。这也是应该使用 SQL Server 配置管理器更改服务帐户的原因之一 - 因为这样服务主密钥加密会正确重新生成。

http://mattsql.wordpress.com/2012/11/13/migrating-sql-server-databases-that-use-database-master-keys/

【讨论】:

以上是关于物理服务器切换时 SQL Server 2008 打开主密钥错误的主要内容,如果未能解决你的问题,请参考以下文章

将 EF 模型从 SSCE 4.0 切换到 SQL Server 2008 R2

将 XML 插入 SQL Server 时如何解决“无法切换编码”错误

我使用SQL server 2008附加2005的数据库,但是出现错误!

SQL server2008新建数据库怎么设置物理文件名和逻辑文件名?

如何在 SQL Server 2008 中将行切换到列,反之亦然

在远程服务器上的sql server2008连接不上