Lỗi: Triệu chứng nhận không thể bị hủy vì một hoặc nhiều thực thể được ký hoặc mã hóa bằng cách sử dụng.


8

Tôi có một chứng chỉ tôi muốn xóa khỏi cơ sở dữ liệu.

Nếu tôi ban hành lệnh

DROP CERTIFICATE <FooCert>

Tôi nhận được lỗi

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

Theo Jason Strate, tôi sẽ có thể tìm ra những gì được ký bởi chứng chỉ.

Truy vấn sau đây trả về 0 hàng:

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'

Tôi cũng đã thử tách các thực thể theo câu hỏi SO này. /programming/52460/how-do-i-find-and-decouple-entities-from-a-certert-when-upgrad-ms-sqlserv

Làm thế nào tôi có thể loại bỏ các phụ thuộc vào chứng chỉ này để tôi có thể loại bỏ nó?


Bạn có thể vui lòng thử truy vấn tôi đã đăng ở đây không: Tìm các thủ tục đã ký, chức năng, trình kích hoạt, tập hợp và theo đó các chứng chỉ / khóa bất đối xứng . Điều đó có tìm thấy gì không? Nếu vậy, tôi có thể đăng nó, hoặc chỉ là một liên kết đến nó ở đây. Nếu không, tôi đoán đó là Đăng nhập / Người dùng dựa trên Chứng chỉ và tôi có thể đăng một truy vấn cho điều đó.
Solomon Rutzky

Trả về 0 hàng.
Geoff Dawdy

Bạn có bật 'Mã hóa dữ liệu trong suốt' (TDE) trên bất kỳ cơ sở dữ liệu nào của bạn không?
SQLPRODDBA

1
@QueryPRODDBA Cảm ơn bạn đã đề cập đến TDE :-). Tôi đã không nghĩ về điều đó nhưng đã thêm một truy vấn vào câu trả lời của mình để tìm ra điều đó (và đã kiểm tra nó và xác nhận rằng nó hoạt động).
Solomon Rutzky

1
@srutzky Cảm ơn bạn đã xem xét nó! Kịch bản của bạn thật tuyệt vời!
SQLPRODDBA

Câu trả lời:


6

Để tìm các mục được liên kết với Chứng chỉ và Khóa không đối xứng, trước tiên hãy thử truy vấn được đăng trong DBA này. Trả lời:

Tìm các thủ tục đã ký, chức năng, trình kích hoạt, tập hợp và theo đó các chứng chỉ / khóa bất đối xứng

Nếu điều đó không trả về bất kỳ đối tượng nào, tiếp theo hãy thử các truy vấn sau đây để tìm:

  • Đăng nhập
  • Người dùng
  • Điểm cuối môi giới dịch vụ
  • Điểm cuối phản ánh cơ sở dữ liệu
  • Khóa đối xứng
  • Khóa mã hóa cơ sở dữ liệu (được sử dụng cho TDE)

Xin lưu ý rằng Đăng nhập ở cấp Máy chủ / Trường hợp trong khi mọi thứ khác ở cấp Cơ sở dữ liệu. Ngoài ra, Khóa mã hóa cơ sở dữ liệu, trong khi ở cấp Cơ sở dữ liệu, được báo cáo trong DMV trả về dữ liệu cho tất cả các cơ sở dữ liệu và do đó không thay đổi dựa trên Cơ sở dữ liệu "hiện tại".

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

Cảm ơn bạn đã cung cấp các truy vấn. Hầu hết các truy vấn trả về 0 hàng. Mã hóa khóa đối xứng trả về một hàng dường như là chứng chỉ của tôi. Tuy nhiên, tôi vẫn chưa rõ về những gì được ký hoặc mã hóa bởi chứng chỉ này và cách loại bỏ nó.
Geoff Dawdy

1
@GeoffDawdy Vâng, ngày càng xa hơn :-). Nó phải là Khóa đối xứng. Tôi cũng có thể cập nhật truy vấn để THAM GIA trong bảng đó. Giữ lấy.
Solomon Rutzky

@GeoffDawdy Tôi đã cập nhật một truy vấn đó. Hãy thử phiên bản mới của nó. Tất nhiên, nếu một hoặc nhiều Khóa đối xứng đang được sử dụng, đó là một vấn đề khác ;-). Và hãy chắc chắn có một tệp sao lưu Giấy chứng nhận và Khóa riêng của nó trước khi xóa :-)
Solomon Rutzky

Vâng, cùng một chứng chỉ xuất hiện. Vì vậy, điều này có nghĩa là chứng chỉ được ký bởi chính nó? Làm thế nào tôi có thể xóa nó đi nếu tôi gặp lỗi nói rằng nó không thể bị loại bỏ.
Geoff Dawdy

1
Tôi chỉ cần tìm nó ra. Chìa khóa của tôi đã được ký bởi chứng chỉ cần phải bỏ. Khi tôi đánh rơi khóa đối xứng, tôi cũng có thể bỏ chứng chỉ. Cảm ơn tất cả sự giúp đỡ của bạn!
Geoff Dawdy

1

Gặp phải một vấn đề tương tự, đối với tôi truy vấn này đã giúp tôi tìm thấy đối tượng đã ký:

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'

Nguồn

Sau đó, tôi chỉ sử dụng lệnh sau đây làm ví dụ trong đó dbo.sp_nameđối tượng đã ký và STOREDPROCEDURESIGNINGCERTlà chứng chỉ ký.

DROP SIGNATURE FROM OBJECT::dbo.sp_name BY CERTIFICATE STOREDPROCEDURESIGNINGCERT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.