Kesalahan: "Sertifikat tidak dapat dijatuhkan karena satu atau lebih entitas ditandatangani atau dienkripsi menggunakannya."

8

Saya memiliki sertifikat yang ingin saya hapus dari database.

Jika saya mengeluarkan perintah

DROP CERTIFICATE <FooCert>

Saya mendapatkan kesalahan

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

Menurut Jason Strate, saya harus bisa mengetahui apa yang ditandatangani oleh sertifikat.

Kueri berikut mengembalikan 0 baris:

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'

Saya juga mencoba memisahkan entitas per pertanyaan SO ini. /programming/52460/how-do-i-find-and-decouple-entities-from-a-certificate-when-upgrading-ms-sqlserv

Bagaimana saya bisa menghapus dependensi pada sertifikat ini sehingga saya bisa menghapusnya?

Geoff Dawdy
sumber
Bisakah Anda mencoba pertanyaan yang saya posting di sini: Temukan prosedur, fungsi, pemicu, rakitan yang ditandatangani, dan dengan sertifikat mana / kunci asimetris . Apakah itu menemukan sesuatu? Jika demikian, saya dapat mempostingnya, atau hanya tautan ke sini. Jika tidak, saya rasa ini adalah Login / Pengguna berbasis Sertifikat dan saya dapat memposting pertanyaan untuk itu.
Solomon Rutzky
0 baris dikembalikan.
Geoff Dawdy
Apakah Anda mengaktifkan 'Enkripsi Data Transparan' (TDE) di salah satu basis data Anda?
SQLPRODDBA
1
@SQLPRODDBA Terima kasih telah menyebutkan TDE :-). Saya belum memikirkan hal itu tetapi telah menambahkan pertanyaan pada jawaban saya untuk menemukan itu juga (dan telah mengujinya dan mengonfirmasi bahwa itu berhasil).
Solomon Rutzky
1
@srutzky Terima kasih telah mempertimbangkannya! Script Anda luar biasa!
SQLPRODDBA

Jawaban:

6

Untuk menemukan item yang terkait dengan Sertifikat dan Kunci Asimetris, pertama coba kueri yang diposting di DBA.SE ini.

Temukan prosedur, fungsi, pemicu, rakitan, dan yang ditandatangani sertifikat / kunci asimetris yang ditandatangani

Jika itu tidak mengembalikan objek apa pun, selanjutnya coba pertanyaan berikut yang mencari:

  • Info masuk
  • Pengguna
  • Titik Akhir Pialang Layanan
  • Endpoint Mirroring Basis Data
  • Kunci Simetris
  • Kunci Enkripsi Basis Data (digunakan untuk TDE)

Harap dicatat bahwa Login adalah tingkat Server / Instance sedangkan yang lainnya adalah tingkat Database. Selain itu, Kunci Enkripsi Basis Data, saat berada di level Basis Data, dilaporkan dalam DMV yang mengembalikan data untuk semua basis data, dan karenanya tidak berubah berdasarkan pada Basis Data "saat ini".

-- 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
sumber
Terima kasih telah memberikan pertanyaan. Sebagian besar kueri mengembalikan 0 baris. Enkripsi Kunci Symmetric mengembalikan satu baris yang tampaknya merupakan sertifikat saya. Namun, saya masih tidak jelas tentang apa yang ditandatangani atau dienkripsi oleh sertifikat ini dan cara menghapusnya.
Geoff Dawdy
1
@ GeoffDawdy Nah, semakin jauh :-). Seharusnya Kunci Simetris itu sendiri. Saya dapat memperbarui kueri untuk BERGABUNG di tabel itu juga. Tahan.
Solomon Rutzky
@ GeoffDawdy Saya telah memperbarui satu permintaan itu. Silakan coba versi baru itu. Tentu saja, jika satu atau lebih Kunci Simetris sedang digunakan, itu adalah masalah lain ;-). Dan pastikan untuk memiliki file cadangan Sertifikat dan Kunci
Privatnya
Ya, sertifikat yang sama muncul. Jadi apakah ini berarti sertifikat ditandatangani dengan sendirinya? Bagaimana saya bisa menghapusnya jika saya mendapatkan kesalahan dengan mengatakan itu tidak bisa dihapus.
Geoff Dawdy
1
Saya baru saja menemukan jawabannya. Kunci saya yang telah ditandatangani oleh sertifikat harus dijatuhkan. Begitu saya menjatuhkan kunci simetris, saya bisa menjatuhkan sertifikat juga. Terima kasih atas seluruh bantuan Anda!
Geoff Dawdy
1

Mengalami masalah serupa, bagi saya kueri ini membantu saya menemukan objek yang ditandatangani:

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'

Sumber

Kemudian saya hanya menggunakan perintah berikut sebagai contoh di mana dbo.sp_nameobjek yang ditandatangani dan STOREDPROCEDURESIGNINGCERTsertifikat penandatanganan.

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