SQL Server还原透明加密(TDE)数据库遇到的错误

​错误1:请在数据库中创建一个主密钥或在会话中打开该主密钥

执行 Transact-SQL 语句或批处理时发生了异常。在执行此操作之前,请在数据库中创建一个主密钥或在会话中打开该主密钥。错误号: 15581

严重性: 16

状态: 3

行号: 1

发生这个错误有三种情况:

  1. 确实没有创建数据库主秘钥

  2. 创建了主秘钥,但是有使用ALTER MASTER KEY DROP ENCRYPTION BY SERVICE MASTER KEY 删除了服务器主秘钥对数据库主秘钥的加密

  3. 使用  RESTORE MASTER KEY FROM FILE='File_Name'  DECRYPTION BY PASSWORD='备份DEK时使用的密码' ENCRYPTION BY PASSWORD='强密码' 创建备份证书。

对于情况1,我们可以使用系统试图 sys.symmetric_keys 确定是否创建数据库主密钥:

USE master
GO
SELECT * FROM sys.symmetric_keys

如果结果集中没有##MS_DatabaseMasterKey## ,则说明未创建数据库主密钥,那么我们需要重新创建数据库主密钥,再还原证书和私钥;如果存在,则可能是2或者3的情况了,我们可以使用下面语句,确定数据库主密钥是否使用服务器主密钥进行加密:

SELECT  name, is_master_key_encrypted_by_server
FROM    sys.databases
WHERE   name = 'master'

开启数据库主密钥的服务器主密钥加密方式:

OPEN MASTER KEY DECRYPTION BY PASSWORD='创建DEK时使用的密码或者还原主密钥时使用的加密密码'
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY

之后再进行还原就可以顺利进行了。

警告1:证书过期

证书的默认过期日期为1年

--证书默认过期日期为一年
SELECT  name, start_date, expiry_date
FROM    sys.certificates
WHERE   name = 'Test3Cert'

如果证书过期了,会对透明加密有什么影响呢?下面我们讲过刚刚还原的test3_Encrypted 数据库透明加密关闭,并删除其数据库秘钥,然后再删除服务器证书Test3Cert:

USE master
GO
ALTER DATABASE test3_Encrypted SET ENCRYPTION OFF
GO
USE test3_Encrypted
GO
DROP DATABASE ENCRYPTION KEY
USE master
GO
DROP CERTIFICATE Test3Cert

重新创建证书,使得过期时间在几分钟后,方便我们测试:

USE master
GO
CREATE CERTIFICATE Test3Cert
WITH SUBJECT='Test3 Certificate for expirate date'
       ,EXPIRY_DATE='2020-2-19 14:20:00'
USE test3_Encrypted
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM=AES_128
ENCRYPTION BY SERVER CERTIFICATE Test3Cert
GO
​
USE master
GO
ALTER DATABASE test3_Encrypted SET ENCRYPTION ON
GO

我们先确认一下证书是否过期,查询系统视图 sys.certificates 结果如下:

显然当前时间已经超过了证书过期时间,然后我们再备份数据库test3_Encrypted。备份后时记事本打开备份文件,并搜索Jack,发现仍然找不到这个字符串,说明数据库备份文件仍然处于加密状态

BACKUP CERTIFICATE Test3Cert
TO FILE ='D:\Test3Cert.cer'
WITH PRIVATE KEY(FILE='D:\Test3Cert_Key.pvk',
ENCRYPTION BY PASSWORD='jC`T?]K,v`{voD<')       --用于在将密钥写入备份文件之前对私钥进行加密的密码。该密码需要进行复杂性检查。
GO

然后删除test3_Encrypted数据库,删除证书

USE master
GO
DROP DATABASE test3_Encrypted
GO
--删除证书
DROP CERTIFICATE Test3Cert

使用证书和私钥重新创建证书:

CREATE CERTIFICATE Test3Cert
FROM FILE = 'D:\Test3Cert.cer'
WITH PRIVATE KEY(FILE='D:\Test3Cert_Key.pvk',
       DECRYPTION BY PASSWORD='jC`T?]K,v`{voD<');
GO

在还原证书的时候,会出现截图的警告,我们先不理会这个警告,再次还原数据库:

USE [master]
RESTORE DATABASE [test3_Encrypted_CertExpiry] FROM  DISK = N'D:\test3_Encrypted_CertExpiry.bak'
WITH  FILE = 1,
MOVE   'test3' to 'D:\DB\test3_Encrypted_CertExpiry.mdf',
MOVE 'test3_log' to 'D:\DB\test3_Encrypted_CertExpiry_Log.ldf',
NOUNLOAD,  STATS = 5
GO

当证书过期后,使用证书和私钥还原加密数据库的备份文件,仍然可以成功,只是会提示证书过期。

解决证书过期的方案:

可惜的是ALTER CERTIFICATE中并未提到修改EXPIRY_DATE的方法,如果想要解决证书过期的问题,只能重新创建证书,使用ALTER DATABASE ENCRYPTION KEY 对数据库再次加密:

ALTER DATABASE ENCRYPTION KEY TDEDEKeyName
WITH ALGORITHM=AES_128
ENCRYPTION BY SERVER CERTIFICATE NewCertName

当然,在重新加密数据库后,我们还需要做的是归档原有的证书、私钥备份文件,保存好新的证书、私钥备份;需要防止原有证书、私钥丢失造成历史备份无法还原、数据丢失的问题。

过期证书、新证书备份、归档完毕后,可以删除过期证书。

数据库管理员移交管理内容时,要移交所有相关文档,新的接收人要修改私钥密码或者对数据库进行重新加密。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章