物理服务器转换时SQL Server 2008 Open Master Key错误

时间:2010-01-07 02:37:40

标签: sql sql-server-2008 encryption aes

我将一个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加密的数据没有显示出来。但是,未加密的列会这样做。

非常感谢任何帮助。提前致谢!

2 个答案:

答案 0 :(得分:68)

使用服务器主密钥对数据库主密钥进行加密,该主密钥特定于安装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

请注意,在创建数据库主密钥时,也应始终提供密码,以便在无法使用服务主密钥的情况下使用密码打开密钥 - 希望您拥有该密码存储在某处!

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

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

答案 1 :(得分:3)

我刚遇到类似的情况,OS驱动器死后服务器重建。我重新安装了SQL并将其重新连接到未经修改的数据驱动器上的所有旧数据库。除了我的加密列,一切都有效。但我的问题是主服务密钥已被清除。我可以通过返回到移动之前一直是我的SQL服务器服务帐户的相同域凭据来修复我的主服务密钥。

article给了我修复(对于他的优秀文章,感谢Matt Bowler)。我知道本地机器密钥已经改变,但我的救赎是我可以使用相同的服务帐户。

服务主密钥:密钥层次结构的顶部是服务主密钥。每个SQL Server实例有一个,它是一个对称密钥,它存储在master数据库中。用于加密数据库主密钥,链接服务器密码和凭据,它是在第一次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/