Erreur: «Le certificat ne peut pas être supprimé car une ou plusieurs entités sont signées ou chiffrées à l'aide de celui-ci.»

8

J'ai un certificat que je voudrais supprimer de la base de données.

Si j'émets la commande

DROP CERTIFICATE <FooCert>

Je reçois l'erreur

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

Selon Jason Strate, je devrais pouvoir savoir ce qui est signé par le certificat.

La requête suivante renvoie 0 lignes:

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'

J'ai également essayé de découpler les entités par cette question SO. /programming/52460/how-do-i-find-and-decouple-entities-from-a-certificate-when-upgrading-ms-sqlserv

Comment puis-je supprimer les dépendances de ce certificat afin de pouvoir le supprimer?

Geoff Dawdy
la source
Pouvez-vous s'il vous plaît essayer la requête que j'ai postée ici: trouver des procédures signées, des fonctions, des déclencheurs, des assemblys et par quels certificats / clés asymétriques . Cela trouve-t-il quelque chose? Si oui, je peux le poster, ou juste un lien ici. Sinon, je suppose qu'il s'agit d'un identifiant / utilisateur basé sur un certificat et je peux poster une requête pour cela.
Solomon Rutzky
0 lignes retournées.
Geoff Dawdy
Le chiffrement transparent des données (TDE) est-il activé sur l'une de vos bases de données?
SQLPRODDBA
1
@SQLPRODDBA Merci d'avoir mentionné TDE :-). Je n'y avais pas pensé, mais j'ai ajouté une requête à ma réponse pour trouver cela également (et je l'ai testée et confirmé qu'elle fonctionne).
Solomon Rutzky
1
@srutzky Merci de l'avoir considéré! Votre script est génial!
SQLPRODDBA

Réponses:

6

Pour rechercher des éléments associés aux certificats et aux clés asymétriques, essayez d'abord la requête publiée dans ce DBA.SE Réponse:

Trouvez les procédures signées, les fonctions, les déclencheurs, les assemblys et par quels certificats / clés asymétriques

Si cela ne renvoie aucun objet, essayez ensuite les requêtes suivantes qui recherchent:

  • Identifiants
  • Utilisateurs
  • Points de terminaison Service Broker
  • Points de terminaison de mise en miroir de bases de données
  • Clés symétriques
  • Clés de chiffrement de base de données (utilisées pour TDE)

Veuillez noter que les connexions sont au niveau serveur / instance tandis que tout le reste est au niveau base de données. En outre, les clés de chiffrement de base de données, tout en étant au niveau de la base de données, sont signalées dans un DMV qui renvoie des données pour toutes les bases de données et ne change donc pas en fonction de la base de données "actuelle".

-- 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
la source
Merci d'avoir fourni les requêtes. La plupart des requêtes ont renvoyé 0 ligne. Le chiffrement à clé symétrique a renvoyé une ligne qui semble être mon certificat. Cependant, je ne sais toujours pas ce qui est signé ou chiffré par ce certificat et comment le supprimer.
Geoff Dawdy
1
@GeoffDawdy Eh bien, allez plus loin :-). Il doit s'agir de la clé symétrique elle-même. Je peux également mettre à jour la requête pour JOIN dans cette table. Attendez.
Solomon Rutzky
@GeoffDawdy J'ai mis à jour cette requête. Veuillez en essayer la nouvelle version. Bien sûr, si une ou plusieurs clés symétriques sont utilisées, c'est un autre problème ;-). Et assurez-vous d'avoir un fichier de sauvegarde du certificat et de sa clé privée avant de le supprimer :-)
Solomon Rutzky
Oui, le même certificat est apparu. Cela signifie-t-il donc que le certificat est signé par lui-même? Comment puis-je procéder pour le supprimer si j'obtiens l'erreur disant qu'il ne peut pas être supprimé.
Geoff Dawdy
1
Je viens de comprendre. Ma clé signée par le certificat devait être supprimée. Une fois que j'ai supprimé la clé symétrique, j'ai également pu supprimer le certificat. Merci pour votre aide!
Geoff Dawdy
1

Rencontré un problème similaire, pour moi, cette requête m'a aidé à trouver l'objet signé:

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'

La source

Ensuite, je viens d'utiliser la commande suivante comme exemple où se dbo.sp_nametrouve l'objet signé et STOREDPROCEDURESIGNINGCERTle certificat de signature.

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