Fehler: "Das Zertifikat kann nicht gelöscht werden, da eine oder mehrere Entitäten damit signiert oder verschlüsselt sind."

8

Ich habe ein Zertifikat, das ich aus der Datenbank entfernen möchte.

Wenn ich den Befehl erteile

DROP CERTIFICATE <FooCert>

Ich bekomme den Fehler

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

Laut Jason Strate sollte ich herausfinden können, was mit dem Zertifikat signiert ist.

Die folgende Abfrage gibt 0 Zeilen zurück:

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'

Ich habe auch versucht, die Entitäten gemäß dieser SO-Frage zu entkoppeln. /programming/52460/how-do-i-find-and-decouple-entities-from-a-certificate-when-upgrading-ms-sqlserv

Wie kann ich die Abhängigkeiten von diesem Zertifikat entfernen, damit ich es entfernen kann?

Geoff Dawdy
quelle
Können Sie bitte die Abfrage versuchen, die ich hier gepostet habe: Finden Sie signierte Prozeduren, Funktionen, Trigger, Assemblys und nach welchen Zertifikaten / asymmetrischen Schlüsseln . Findet das etwas? Wenn ja, kann ich es hier posten oder nur einen Link dazu. Wenn nicht, handelt es sich vermutlich um einen zertifikatbasierten Login / Benutzer, und ich kann eine Abfrage dazu stellen.
Solomon Rutzky
0 Zeilen zurückgegeben.
Geoff Dawdy
Haben Sie "Transparente Datenverschlüsselung" (TDE) in einer Ihrer Datenbanken aktiviert?
SQLPRODDBA
1
@SQLPRODDBA Danke, dass du TDE erwähnt hast :-). Ich hatte nicht darüber nachgedacht, aber meiner Antwort eine Abfrage hinzugefügt, um dies ebenfalls zu finden (und es getestet und bestätigt, dass es funktioniert).
Solomon Rutzky
1
@srutzky Danke, dass du darüber nachgedacht hast! Dein Drehbuch ist großartig!
SQLPRODDBA

Antworten:

6

Versuchen Sie zunächst die in dieser DBA.SE-Antwort angegebene Abfrage, um Elemente zu finden, die mit Zertifikaten und asymmetrischen Schlüsseln verknüpft sind. Antwort:

Finden Sie signierte Prozeduren, Funktionen, Trigger, Assemblys und nach welchen Zertifikaten / asymmetrischen Schlüsseln

Wenn dadurch keine Objekte zurückgegeben werden, versuchen Sie als Nächstes die folgenden Abfragen, nach denen gesucht wird:

  • Anmeldungen
  • Benutzer
  • Service Broker-Endpunkte
  • Datenbankspiegelungsendpunkte
  • Symmetrische Tasten
  • Datenbankverschlüsselungsschlüssel (für TDE verwendet)

Bitte beachten Sie, dass Anmeldungen auf Server- / Instanzebene erfolgen, während alles andere auf Datenbankebene erfolgt. Außerdem werden Datenbankverschlüsselungsschlüssel auf Datenbankebene in einer DMV gemeldet, die Daten für alle Datenbanken zurückgibt und sich daher nicht basierend auf der "aktuellen" Datenbank ändert.

-- 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
quelle
Vielen Dank für die Bereitstellung der Fragen. Die meisten Abfragen gaben 0 Zeilen zurück. Die symmetrische Schlüsselverschlüsselung gab eine Zeile zurück, die mein Zertifikat zu sein scheint. Ich bin mir jedoch immer noch nicht sicher, was von diesem Zertifikat signiert oder verschlüsselt wird und wie es entfernt werden kann.
Geoff Dawdy
1
@GeoffDawdy Nun, weiter kommen :-). Es sollte der symmetrische Schlüssel selbst sein. Ich kann die Abfrage auch in dieser Tabelle auf JOIN aktualisieren. Warten Sie mal.
Solomon Rutzky
@GeoffDawdy Ich habe diese eine Abfrage aktualisiert. Bitte probieren Sie die neue Version aus. Wenn ein oder mehrere symmetrische Schlüssel verwendet werden, ist dies natürlich ein weiteres Problem ;-). Und stellen Sie sicher, dass Sie eine Sicherungsdatei des Zertifikats und seines privaten Schlüssels haben, bevor Sie es löschen :-)
Solomon Rutzky
Ja, das gleiche Zertifikat wurde angezeigt. Bedeutet dies also, dass das Zertifikat von selbst signiert ist? Wie kann ich es löschen, wenn die Fehlermeldung angezeigt wird, dass es nicht gelöscht werden kann?
Geoff Dawdy
1
Ich habe es gerade herausgefunden. Mein vom Zertifikat signierter Schlüssel musste gelöscht werden. Nachdem ich den symmetrischen Schlüssel gelöscht hatte, konnte ich auch das Zertifikat löschen. Danke für deine Hilfe!
Geoff Dawdy
1

Bei einem ähnlichen Problem ist mir diese Abfrage geholfen, das signierte Objekt zu finden:

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'

Quelle

Dann habe ich nur den folgenden Befehl als Beispiel verwendet, bei dem dbo.sp_namees sich um das signierte Objekt und STOREDPROCEDURESIGNINGCERTdas Signaturzertifikat handelt.

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