1

我试图研究我在我的 sql2012 可用性组中使用读取意图辅助副本遇到的问题,但似乎找不到任何东西,我确实看到了一些关于实例级 TDE 的事情,但没有看到数据库级证书。

概述,我有一个数据库,它有一个带有加密列的表,该列使用数据库证书进行加密/解密。可用性组的设置以及创建数据库和副本似乎都进展顺利(三个独立的节点)。但是,当我尝试通过具有读取意图连接的侦听器连接到第二个节点的只读辅助副本,并使用加密列查询此表时,返回的数据全部为 NULL。如果我首先使用密码打开主密钥,然后发出查询,我将返回的数据正常解密,但仅持续该会话连接。我应该提一下,除了主副本和辅助副本的加密问题之外,其他所有问题都可以正常工作。如果我使用 readWrite 查询主数据库,则数据检索得很好。

有谁知道这是否是现在将查询作为只读副本的读取意图,每个会话连接必须首先打开主密钥?还是我设置了一些不正确的东西,我能做些什么来解决这个问题?

打开主键命令:

OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password';

用于查看加密列的查询:

SELECT CAST(DECRYPTBYCERT(CERT_ID('CertName'), ColName) AS VARCHAR(200)) aliasColName
  FROM [DBName].[dbo].[tableName]

以下是用于在主节点上创建证书的 sql:

USE DBName
DROP CERTIFICATE CertName;
GO

USE DBName
IF NOT EXISTS (SELECT * FROM sys.symmetric_keys 
WHERE [name] LIKE '%DatabaseMasterKey%')
BEGIN
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'
END
GO 

USE DBName
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
GO

USE DBName
CREATE CERTIFICATE CertName FROM FILE = 'C:\Cert.cer'
  WITH PRIVATE KEY ( FILE = 'C:\CertKey.pvk' , 
  DECRYPTION BY PASSWORD = 'password' );
GO

CLOSE MASTER KEY
GO

谢谢大家!

4

1 回答 1

1

在完成该过程后,我找到了解决方案并将其发布在这里,以防其他人遇到同样的事情。

由于数据库主密钥是使用主数据库的服务主密钥加密的,因此我必须将主服务器的服务主密钥强制备份到所有辅助服务器,以便不必在每个会话中明确“打开”数据库主密钥。因此,不仅主密钥需要删除,服务主密钥也需要删除,以保持加密层次结构相同,以使只读路由正常工作。下面是代码。

首先从主服务器备份服务主密钥并将其复制到所有辅助服务器。

BACKUP SERVICE MASTER KEY TO FILE = 'C:\service_master_key' 
  ENCRYPTION BY PASSWORD = 'password';

然后使用 FORCE 选项将其还原到所有辅助服务器。

RESTORE SERVICE MASTER KEY FROM FILE = 'C:\service_master_key' 
  DECRYPTION BY PASSWORD = 'password' FORCE

谢谢

于 2013-02-15T21:08:34.580 回答