Erro: "O certificado não pode ser descartado porque uma ou mais entidades são assinadas ou criptografadas usando-o."

8

Eu tenho um certificado que gostaria de remover do banco de dados.

Se eu emitir o comando

DROP CERTIFICATE <FooCert>

Eu recebo o erro

The certificate cannot be dropped because one or more entities are either signed or encrypted using it

Segundo Jason Strate, eu devo descobrir o que é assinado pelo certificado.

A consulta a seguir retorna 0 linhas:

SELECT OBJECT_SCHEMA_NAME(co.major_id) + '.' + OBJECT_NAME(co.major_id)
FROM sys.certificates c 
INNER JOIN sys.crypt_properties co ON c.thumbprint = co.thumbprint
WHERE co.crypt_type_desc = 'SIGNATURE BY CERTIFICATE' 
AND c.name = 'FooCert'

Eu também tentei dissociar as entidades por essa pergunta SO. /programming/52460/how-do-i-find-and-decouple-entities-from-a-certificate-when-upgrading-ms-sqlserv

Como posso remover as dependências deste certificado para poder removê-lo?

Geoff Dawdy
fonte
Você pode tentar a consulta que publiquei aqui: Encontre procedimentos assinados, funções, gatilhos, montagens e por quais certificados / chaves assimétricas . Isso encontra alguma coisa? Nesse caso, posso postá-lo ou apenas um link para ele aqui. Caso contrário, acho que é um login / usuário baseado em certificado e posso postar uma consulta para isso.
Solomon Rutzky,
0 linhas retornadas.
Geoff Dawdy
Você tem a 'criptografia de dados transparente' (TDE) ativada em qualquer um dos seus bancos de dados?
SQLPRODDBA
11
@SQLPRODDBA Obrigado por mencionar o TDE :-). Eu não tinha pensado nisso, mas adicionei uma consulta à minha resposta para descobrir isso também (e testei e confirmei que funciona).
Solomon Rutzky,
11
@srutzky Obrigado por considerá-lo! Seu script é incrível!
SQLPRODDBA

Respostas:

6

Para localizar itens associados a Certificados e Chaves Assimétricas, tente primeiro a consulta publicada neste DBA.SE Resposta:

Encontre procedimentos assinados, funções, gatilhos, montagens e pelos quais certificados / chaves assimétricas

Se isso não retornar nenhum objeto, tente as seguintes consultas que procuram:

  • Logins
  • Comercial
  • Pontos de extremidade do Service Broker
  • Pontos finais de espelhamento de banco de dados
  • Chaves simétricas
  • Chaves de criptografia de banco de dados (usadas para TDE)

Observe que os logons são no nível do servidor / instância, enquanto todo o resto é no nível do banco de dados. Além disso, as Chaves de Criptografia de Banco de Dados, embora estejam no nível do Banco de Dados, são relatadas em uma DMV que retorna dados para todos os bancos de dados e, portanto, não são alteradas com base no Banco de Dados "atual".

-- Server / Instance Logins (results not sensitive to local / current Database)
;WITH certs_n_keys AS
(
  SELECT 'Certifcate' AS [Type], crts.name, crts.certificate_id AS [cert_or_asymkey_id],
         crts.principal_id, crts.pvt_key_encryption_type_desc, crts.[sid],
         crts.thumbprint
  FROM   [master].sys.certificates crts
  UNION ALL
  SELECT 'Asymmetric Key' AS [Type], asym.name, asym.asymmetric_key_id AS
         [cert_or_asymkey_id], asym.principal_id, asym.pvt_key_encryption_type_desc,
         asym.[sid], asym.thumbprint
  FROM   [master].sys.asymmetric_keys asym
)
SELECT cnk.*, '---' AS [---],
       sp.[name] AS [PrincipalName], sp.principal_id, sp.type_desc,
       sp.create_date, sp.modify_date
FROM   certs_n_keys cnk
INNER JOIN sys.server_principals sp
        ON sp.[sid] = cnk.[sid];


-- Database Users
;WITH certs_n_keys AS
(
  SELECT 'Certifcate' AS [Type], crts.name, crts.certificate_id AS [cert_or_asymkey_id],
         crts.principal_id, crts.pvt_key_encryption_type_desc, crts.[sid],
         crts.thumbprint
  FROM   sys.certificates crts
  UNION ALL
  SELECT 'Asymmetric Key' AS [Type], asym.name, asym.asymmetric_key_id AS
         [cert_or_asymkey_id], asym.principal_id, asym.pvt_key_encryption_type_desc,
         asym.[sid], asym.thumbprint
  FROM   sys.asymmetric_keys asym
)
SELECT cnk.*, '---' AS [---],
       dp.[name] AS [PrincipalName], dp.principal_id, dp.type_desc,
       dp.create_date, dp.modify_date
FROM   certs_n_keys cnk
INNER JOIN sys.database_principals dp
        ON dp.[sid] = cnk.[sid];


-- Service Broker Endpoints
SELECT crts.name, crts.certificate_id, crts.principal_id,
       crts.pvt_key_encryption_type_desc, crts.[sid], crts.thumbprint, '---' AS [---],
       endpts.*
FROM   sys.certificates crts
INNER JOIN sys.service_broker_endpoints endpts
        ON endpts.certificate_id = crts.certificate_id;


-- Database Mirroring Endpoints
SELECT crts.name, crts.certificate_id, crts.principal_id,
       crts.pvt_key_encryption_type_desc, crts.[sid], crts.thumbprint, '---' AS [---],
       endpts.*
FROM   sys.certificates crts
INNER JOIN sys.database_mirroring_endpoints endpts
        ON endpts.certificate_id = crts.certificate_id;


-- Symmetric Keys (scroll results to the right to see Key name)
SELECT crts.name, crts.certificate_id, crts.principal_id,
       crts.pvt_key_encryption_type_desc, crts.[sid], crts.thumbprint, '---' AS [---],
       ncrptns.*, '---' AS [---], symkys.*
FROM   sys.certificates crts
INNER JOIN sys.key_encryptions ncrptns
        ON ncrptns.[thumbprint] = crts.[thumbprint]
INNER JOIN sys.symmetric_keys symkys
        ON symkys.[symmetric_key_id] = ncrptns.[key_id];


-- Database Encryption Keys (for TDE; results not sensitive to local / current Database)
SELECT crts.name, crts.certificate_id, crts.principal_id,
       crts.pvt_key_encryption_type_desc, crts.[sid], crts.thumbprint, '---' AS [---],
       DB_NAME(dbkeys.[database_id]) AS [DatabaseName], dbkeys.*
FROM   [master].sys.certificates crts
INNER JOIN sys.dm_database_encryption_keys dbkeys
        ON dbkeys.[encryptor_thumbprint] = crts.[thumbprint];
Solomon Rutzky
fonte
Obrigado por fornecer as consultas. A maioria das consultas retornou 0 linhas. A Criptografia de Chave Simétrica retornou uma linha que parece ser o meu certificado. No entanto, ainda não estou claro sobre o que é assinado ou criptografado por este certificado e como removê-lo.
Geoff Dawdy
11
@GeoffDawdy Bem, ficando mais longe :-). Deve ser a própria chave simétrica. Também posso atualizar a consulta para JOIN nessa tabela. Aguente.
Solomon Rutzky
@GeoffDawdy Atualizei essa consulta. Por favor, tente a nova versão. Obviamente, se uma ou mais Chaves Simétricas estiverem em uso, isso é outra questão ;-). E não deixe de ter um arquivo de backup do certificado e sua chave privada antes de apagar :-)
Solomon Rutzky
Sim, o mesmo certificado apareceu. Então, isso significa que o certificado é assinado por ele mesmo? Como posso excluí-lo se eu receber o erro dizendo que ele não pode ser descartado.
Geoff Dawdy
11
Eu só descobri. Minha chave que foi assinada pelo certificado precisava ser descartada. Depois que soltei a chave simétrica, também pude soltar o certificado. Obrigado por toda sua ajuda!
Geoff Dawdy
1

Foi encontrado um problema semelhante. Para mim, essa consulta me ajudou a encontrar o objeto assinado:

SELECT OBJECT_SCHEMA_NAME(co.major_id) + '.' + OBJECT_NAME(co.major_id), c.name 
FROM sys.certificates c 
INNER JOIN sys.crypt_properties co ON c.thumbprint = co.thumbprint
WHERE co.crypt_type_desc = 'SIGNATURE BY CERTIFICATE'

Fonte

Depois, usei o comando a seguir como exemplo, onde dbo.sp_nameestá o objeto assinado e STOREDPROCEDURESIGNINGCERTo certificado de assinatura.

DROP SIGNATURE FROM OBJECT::dbo.sp_name BY CERTIFICATE STOREDPROCEDURESIGNINGCERT
MichaelChan
fonte