Frage:
Ich versuche, ein einzelnes (selbstsigniertes) Zertifikat zu erstellen und in vielen Datenbanken und Instanzen bereitzustellen.
Ich erstelle und sichere das Zertifikat mit:
USE MASTER
CREATE CERTIFICATE DavesCert ENCRYPTION BY PASSWORD ='S3creT!' WITH SUBJECT = 'The master cert'
BACKUP CERTIFICATE DavesCert TO FILE = 'd:\DavesCert.cer'
WITH PRIVATE KEY ( DECRYPTION BY PASSWORD = 'S3creT!' ,
FILE = 'd:\DavesCert.pvk' ,
ENCRYPTION BY PASSWORD = 'S3creT!' );
Ich restauriere mit
USE FOO
GO
CREATE CERTIFICATE ERecruitStatsGatheringCert
FROM FILE = 'd:\DavesCert.cer'
WITH PRIVATE KEY (FILE = 'd:\DavesCert.pvk',
DECRYPTION BY PASSWORD = 'S3creT!')
und erhalten Sie die folgende Fehlermeldung: "Bitte erstellen Sie einen Hauptschlüssel in der Datenbank oder öffnen Sie den Hauptschlüssel in der Sitzung, bevor Sie diesen Vorgang ausführen."
Ich möchte keinen Datenbankhauptschlüssel erstellen. Gerne entschlüssele ich das Zertifikat bei Bedarf per Passwort.
Hintergrund: SaaS-Anwendung. Viele-zu-Viele-Beziehung zwischen DBs und Instanzen.
Ich benötige jede Datenbank, um ihre eigenen Statistiken abfragen zu können, indem eine gespeicherte Prozedur ausgeführt wird, die einige Aufrufe an DMVs abschließt, um die Statistiken zurückzugeben.
Die App wird unter einem Konto mit geringen Berechtigungen ausgeführt. DMVs erfordern die Berechtigung VIEW SERVER STATE. Daher implementiere ich das Signieren der gespeicherten Prozeduren mithilfe von Zertifikaten.
Die grundlegende Methode zum Einrichten ist:
- Erstellen Sie ein Zertifikat in der Benutzer-DB.
- Sichern / Wiederherstellen dieses Zertifikats auf dem Master.
- Erstellen Sie einen Login im Master, weisen Sie diese Berechtigungen zu usw.
- Zertifikat zur gespeicherten Prozedur hinzufügen.
Ich habe Testcode für die oben genannten und es funktioniert gut, aber das Modell skaliert nicht sehr gut für die Bereitstellung über mehrere Instanzen / Datenbank.
Daher denke ich , dass ich für alle DBs / Instanzen dasselbe Zertifikat verwenden möchte.
Gerne für andere Vorschläge / Ansätze.
- Ursprünglich in Stack Exchange veröffentlicht und dann auf Vorschlag einer anderen Verwendung verschoben
quelle
ENCRYPTION BY PASSWORD
). Ein Zertifikat ohne privaten Schlüssel kann nicht verschlüsseln oder signieren, aber es kann entschlüsseln und überprüfen. Sie können also ohne den privaten Schlüssel erstellt werden. Ob dies jedoch sinnvoll ist oder nicht, hängt davon ab, was benötigt wird. Außerdem gilt der Schutz, der Hauptschlüssel oder das Kennwort nur für den privaten Schlüssel. Der öffentliche Schlüssel wird nicht geschützt. Also kein privater Schlüssel = kein Schutzbedarf :-)Sie sollten einen Hauptschlüssel pro Server erstellen, um den Fehler zu vermeiden. Folgendes habe ich getan, um denselben Fehler auf meinen sekundären Servern zu beheben .
Überprüfen Sie dies auf allen Servern, auf denen Sie Datenbanken mit einem Hauptschlüssel abgleichen möchten, der mit dem Diensthauptschlüssel des Servers verschlüsselt ist.
Referenz: https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/sql-server-and-database-encryption-keys-database-engine
Dieser Absatz hat mir geholfen:
quelle
MASTER KEY
(was vielleicht sein Problem war, aber das wird in Ihrer Antwort in keiner Weise erwähnt).