我正在模拟从实例A备份并在实例B上恢复它的情况。我按照文档到Backup to Disk with Encryption。由于我只使用我的桌面来模拟整个过程,所以在备份数据库后,我对使用的证书进行了备份,如下所示:
BACKUP CERTIFICATE MyTestDBBackupEncryptCert
TO FILE = N'C:\Databases\MyTestDBBackupEncryptCert.cert';
然后我MyTestDBBackupEncryptCert
从我的实例中删除了证书和数据库来模拟它现在是实例B。我使用从文件创建证书doc中的命令恢复了证书,并稍作修改,我在其中注释了与PRIVATE KEY
和DECRYPTION
选项相关的行,因为证书是由 加密的MASTER KEY
(嗯,这就是我从第一个链接中理解的):
CREATE CERTIFICATE MyTestDBBackupEncryptCert
FROM FILE = N'C:\Databases\MyTestDBBackupEncryptCert.cert'
--WITH PRIVATE KEY (FILE = 'c:\Shipping\Certs\Shipping11.pvk',
--DECRYPTION BY PASSWORD = 'sldkflk34et6gs%53#v00');
GO
证书已创建,但当我尝试恢复数据库时,出现此错误:
消息 15507,级别 16,状态 30,行 33
此操作所需的密钥似乎已损坏。
消息 3013,级别 16,状态 1,第 33 行
RESTORE DATABASE 异常终止。
该文档没有说明如何获取正确恢复证书所需的私钥。如何从 SQL Server 获取它?
私钥用作
BACKUP CERTIFICATE
语法的一部分。根据docs,语法是:正如您所发现的,
BACKUP CERTICIATE
没有私钥的“简单”不足以恢复用于解密。要使您的证书备份对恢复加密备份有用,您必须备份证书WITH PRIVATE KEY
。一旦你知道了这一点,就更容易记住了,因为你需要密钥来解锁加密——但是“简单”的证书备份可以在没有任何警告的情况下进行这一事实确实代表了一个很大的陷阱,也证明了测试的重要性您的恢复策略,尤其是在涉及加密密钥时。