エラー:「1つ以上のエンティティがそれを使用して署名または暗号化されているため、証明書を削除できません。」


8

データベースから削除したい証明書があります。

コマンドを発行した場合

DROP CERTIFICATE <FooCert>

エラーが出る

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

Jason Strateによれば、証明書によって何が署名されているかを知ることができるはずです。

次のクエリは0行を返します。

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'

このSOの質問に従って、エンティティを分離することも試みました。 /programming/52460/how-do-i-find-and-decouple-entities-from-a-certificate-when-upgrading-ms-sqlserv

この証明書の依存関係を削除して、削除できるようにするにはどうすればよいですか?


私がここに投稿したクエリを試してください:署名されたプロシージャ、関数、トリガー、アセンブリ、および証明書/非対称キーを見つけます。それは何かを見つけますか?もしそうなら、私はそれを投稿するか、ここへのリンクだけを投稿できます。そうでない場合は、それが証明書ベースのログイン/ユーザーであると思います。そのためのクエリを投稿できます。
ソロモンルツキー2016年

0行が返されました。
Geoff Dawdy、2016年

データベースのいずれかで「透過的データ暗号化」(TDE)を有効にしていますか?
SQLPRODDBA

1
@SQLPRODDBA TDEについて言及していただきありがとうございます:-)。私はそれについて考えていませんでしたが、それを見つけるために私の答えにクエリを追加しました(そしてそれをテストし、動作することを確認しました)。
ソロモンルツキー2016年

1
@srutzky検討してくれてありがとう!あなたのスクリプトは素晴らしいです!
SQLPRODDBA 2016年

回答:


6

証明書と非対称キーに関連するアイテムを見つけるには、まず、このDBA.SEの回答に掲載されているクエリを試してください。

署名された手順、関数、トリガー、アセンブリ、およびどの証明書/非対称キーを見つける

それでもオブジェクトが返されない場合は、次のクエリを試してみてください。

  • ログイン
  • ユーザー
  • Service Brokerエンドポイント
  • データベースミラーリングエンドポイント
  • 対称キー
  • データベース暗号化キー(TDEに使用)

ログインはサーバー/インスタンスレベルであり、その他はすべてデータベースレベルであることに注意してください。また、データベースレベルのデータベース暗号化キーは、すべてのデータベースのデータを返すDMVで報告されるため、「現在の」データベースに基づいて変更されることはありません。

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

お問い合わせいただきありがとうございます。ほとんどのクエリは0行を返しました。対称鍵暗号化は、私の証明書のように見える1行を返しました。ただし、この証明書で署名または暗号化されているものと、それを削除する方法については、まだ不明です。
Geoff Dawdy 16年

1
@GeoffDawdyさて、遠くに行く:-)。それは対称キー自体でなければなりません。そのテーブルでもクエリをJOINに更新できます。つかまっている。
ソロモンルツキー16年

@GeoffDawdyその1つのクエリを更新しました。新しいバージョンをお試しください。もちろん、1つ以上の対称キーが使用されている場合、それは別の問題です;-)。また、削除する前に、証明書とその秘密鍵のバックアップファイルがあることを確認してください:-)
Solomon Rutzky

はい、同じ証明書が表示されました。これは、証明書自体が署名されていることを意味しますか?ドロップできないというエラーが表示された場合、どうすれば削除できますか?
ジェフドーディ2016年

1
私はそれを理解しました。証明書によって署名された私の鍵をドロップする必要がありました。対称キーを削除すると、証明書も削除することができました。ご助力いただきありがとうございます!
ジェフドーディ2016年

1

同様の問題が発生しました。私にとって、このクエリは署名されたオブジェクトを見つけるのに役立ちました。

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'

ソース

次に、例として次のコマンドを使用しました。dbo.sp_nameは、署名されたオブジェクトでSTOREDPROCEDURESIGNINGCERTあり、は署名証明書です。

DROP SIGNATURE FROM OBJECT::dbo.sp_name BY CERTIFICATE STOREDPROCEDURESIGNINGCERT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.