Errore: "Il certificato non può essere eliminato perché una o più entità sono firmate o crittografate mediante esso".


8

Ho un certificato che vorrei rimuovere dal database.

Se eseguo il comando

DROP CERTIFICATE <FooCert>

Ottengo l'errore

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

Secondo Jason Strate, dovrei essere in grado di scoprire cosa è firmato dal certificato.

La seguente query restituisce 0 righe:

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'

Ho anche provato a disaccoppiare le entità per questa domanda SO. /programming/52460/how-do-i-find-and-decouple-entities-from-a-certificate-when-upgrading-ms-sqlserv

Come posso rimuovere le dipendenze da questo certificato in modo da poterlo rimuovere?


Puoi provare la query che ho pubblicato qui: trova procedure firmate, funzioni, trigger, assiemi e con quali certificati / chiavi asimmetriche . Questo trova qualcosa? In tal caso, posso pubblicarlo o semplicemente un link qui. In caso contrario, suppongo che si tratti di un accesso / utente basato su certificato e posso inviare una query per questo.
Solomon Rutzky,

0 righe restituite.
Geoff Dawdy,

La "Trasmissione dati trasparente" (TDE) è abilitata su qualsiasi database?
SQLPRODDBA,

1
@SQLPRODDBA Grazie per aver menzionato TDE :-). Non ci avevo pensato, ma ho aggiunto una domanda alla mia risposta per trovarlo (e l'ho testato e confermato che funziona).
Solomon Rutzky,

1
@srutzky Grazie per averlo considerato! La tua sceneggiatura è fantastica!
SQLPRODDBA

Risposte:


6

Per trovare gli elementi associati ai certificati e alle chiavi asimmetriche, provare innanzitutto la query pubblicata in questa risposta DBA.SE:

Trova procedure firmate, funzioni, trigger, assiemi e mediante quali certificati / chiavi asimmetriche

Se ciò non restituisce alcun oggetto, prova quindi le seguenti query che cercano:

  • Account di accesso
  • utenti
  • Endpoint del Service Broker
  • Endpoint del mirroring del database
  • Tasti simmetrici
  • Chiavi di crittografia del database (utilizzate per TDE)

Si noti che gli accessi sono a livello di server / istanza mentre tutto il resto è a livello di database. Inoltre, le chiavi di crittografia del database, pur essendo a livello di database, sono riportate in un DMV che restituisce i dati per tutti i database e quindi non cambia in base al database "corrente".

-- 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];

Grazie per aver fornito le domande. La maggior parte delle query ha restituito 0 righe. La crittografia della chiave simmetrica ha restituito una riga che sembra essere il mio certificato. Tuttavia, non sono ancora chiaro cosa sia firmato o crittografato da questo certificato e come rimuoverlo.
Geoff Dawdy,

1
@GeoffDawdy Bene, sempre più lontano :-). Dovrebbe essere la chiave simmetrica stessa. Posso aggiornare la query a JOIN anche in quella tabella. Resisti.
Solomon Rutzky,

@GeoffDawdy Ho aggiornato quella query. Si prega di provare la nuova versione di esso. Naturalmente, se si utilizzano una o più chiavi simmetriche, questo è un altro problema ;-). E assicurati di avere un file di backup del certificato e della sua chiave privata prima di eliminare :-)
Solomon Rutzky,

Sì, lo stesso certificato è apparso. Quindi questo significa che il certificato è firmato da solo? Come posso fare per cancellarlo se ricevo l'errore dicendo che non può essere eliminato.
Geoff Dawdy,

1
L'ho appena capito. La mia chiave firmata dal certificato doveva essere eliminata. Una volta rilasciata la chiave simmetrica, sono stato in grado di rilasciare anche il certificato. Grazie per tutto il vostro aiuto!
Geoff Dawdy,

1

Si è verificato un problema simile, per me questa query mi ha aiutato a trovare l'oggetto firmato:

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

Quindi ho appena usato il seguente comando come esempio in cui dbo.sp_nameè l'oggetto firmato ed STOREDPROCEDURESIGNINGCERTè il certificato di firma.

DROP SIGNATURE FROM OBJECT::dbo.sp_name BY CERTIFICATE STOREDPROCEDURESIGNINGCERT
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.