Error: "El certificado no se puede descartar porque una o más entidades están firmadas o cifradas con él".

8

Tengo un certificado que me gustaría eliminar de la base de datos.

Si publico el comando

DROP CERTIFICATE <FooCert>

Me sale el error

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

Según Jason Strate, debería poder averiguar qué está firmado por el certificado.

La siguiente consulta devuelve 0 filas:

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'

También he intentado desacoplar las entidades según esta pregunta SO. /programming/52460/how-do-i-find-and-decouple-entities-from-a-certificate-when-upgrading-ms-sqlserv

¿Cómo puedo eliminar las dependencias de este certificado para poder eliminarlo?

Geoff Dawdy
fuente
¿Puede probar la consulta que publiqué aquí? Encuentre procedimientos firmados, funciones, disparadores, ensamblajes y mediante qué certificados / claves asimétricas . ¿Eso encuentra algo? Si es así, puedo publicarlo, o simplemente un enlace a él aquí. Si no es así, supongo que es un inicio de sesión / usuario basado en certificados y puedo publicar una consulta para eso.
Solomon Rutzky
0 filas devueltas.
Geoff Dawdy
¿Tiene habilitado el 'Cifrado transparente de datos' (TDE) en alguna de su base de datos?
SQLPRODDBA
1
@SQLPRODDBA Gracias por mencionar TDE :-). No había pensado en eso, pero he agregado una consulta a mi respuesta para encontrar eso también (y lo he probado y confirmado que funciona).
Solomon Rutzky
1
@srutzky ¡Gracias por considerarlo! ¡Tu guión es increíble!
SQLPRODDBA

Respuestas:

6

Para buscar elementos asociados con certificados y claves asimétricas, primero intente la consulta publicada en este DBA. Respuesta de SE:

Encuentre procedimientos firmados, funciones, disparadores, ensamblajes y por qué certificados / claves asimétricas

Si eso no devuelve ningún objeto, intente las siguientes consultas que buscan:

  • Logins
  • Los usuarios
  • Puntos finales de Service Broker
  • Puntos finales de creación de reflejo de la base de datos
  • Llaves simétricas
  • Claves de cifrado de bases de datos (utilizadas para TDE)

Tenga en cuenta que los inicios de sesión son a nivel de servidor / instancia mientras que todo lo demás es a nivel de base de datos. Además, las claves de cifrado de la base de datos, aunque se encuentran en el nivel de la base de datos, se informan en un DMV que devuelve datos para todas las bases de datos y, por lo tanto, no cambia en función de la base de datos "actual".

-- 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
fuente
Gracias por proporcionar las consultas. La mayoría de las consultas devolvieron 0 filas. El cifrado de clave simétrica devolvió una fila que parece ser mi certificado. Sin embargo, todavía no tengo claro qué está firmado o encriptado por este certificado y cómo eliminarlo.
Geoff Dawdy
1
@GeoffDawdy Bueno, cada vez más lejos :-). Debería ser la clave simétrica misma. También puedo actualizar la consulta a JOIN en esa tabla. Espere.
Solomon Rutzky
@ GeoffDawdy He actualizado esa consulta. Por favor, intente la nueva versión de la misma. Por supuesto, si una o más claves simétricas están en uso, ese es otro problema ;-). Y asegúrese de tener un archivo de respaldo del Certificado y su Clave Privada antes de eliminar :-)
Solomon Rutzky
Sí, apareció el mismo certificado. Entonces, ¿esto significa que el certificado está firmado por sí mismo? ¿Cómo puedo eliminarlo si aparece el error que dice que no se puede descartar?
Geoff Dawdy
1
Me lo imaginé. Mi clave que fue firmada por el certificado necesitaba ser eliminada. Una vez que solté la clave simétrica, también pude soltar el certificado. ¡Gracias por toda tu ayuda!
Geoff Dawdy
1

Encontré un problema similar, para mí esta consulta me ayudó a encontrar el objeto firmado:

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'

Fuente

Luego, utilicé el siguiente comando como ejemplo donde se dbo.sp_nameencuentra el objeto firmado y STOREDPROCEDURESIGNINGCERTel certificado de firma.

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