CREATE CERTIFICATE (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics

Fügt einer Datenbank in SQL Server ein Zertifikat hinzu.

Diese Funktion ist inkompatibel mit Datenbankexport über Data-Tier Application Framework (DACFx). Sie müssen alle Zertifikate vor dem Export löschen.

Hinweis

In SQL Server 2022 (16.x) können Zertifikate mit privaten Schlüsseln direkt in Dateien oder binären Blobs gesichert oder aus diesen wiederhergestellt werden, indem das PKCS#12- (mit öffentlichen Schlüsselpaaren) oder PFX-Format (privater Informationsaustausch) verwendet wird. Alle vom System generierten Zertifikate weisen in SQL Server 2022 (16.x) eine Mindeststärke von RSA-3072 auf.

Das PKCS #12- oder PFX-Format ist ein Binärformat zum Speichern des Serverzertifikats, aller Zwischenzertifikate und des privaten Schlüssels in einer Datei. PFX-Dateien weisen in der Regel Erweiterungen wie .pfx und .p12 auf. Dies erleichtert den Kunden die Einhaltung der aktuellen Sicherheitsrichtlinien und Konformitätsstandards, die eine RC4-Verschlüsselung untersagen, da der Einsatz von Konvertierungstools wie PVKConverter (für das PVK- oder DER-Format) nicht mehr erforderlich ist.

Transact-SQL-Syntaxkonventionen

Hinweis

Diese Syntax wird vom serverlosen SQL-Pool in Azure Synapse Analytics nicht unterstützt.

Syntax

-- Syntax for SQL Server and Azure SQL Database  
  
CREATE CERTIFICATE certificate_name [ AUTHORIZATION user_name ]   
    { FROM <existing_keys> | <generate_new_keys> }  
    [ ACTIVE FOR BEGIN_DIALOG = { ON | OFF } ]  
  
<existing_keys> ::=   
    ASSEMBLY assembly_name  
    | {   
        [ EXECUTABLE ] FILE = 'path_to_file'  
        [ WITH [FORMAT = 'PFX',]
          PRIVATE KEY ( <private_key_options> ) ]   
      }  
    | {   
        BINARY = asn_encoded_certificate  
        [ WITH PRIVATE KEY ( <private_key_options> ) ]  
      }  
<generate_new_keys> ::=   
    [ ENCRYPTION BY PASSWORD = 'password' ]   
    WITH SUBJECT = 'certificate_subject_name'   
    [ , <date_options> [ ,...n ] ]   
  
<private_key_options> ::=  
      {   
        FILE = 'path_to_private_key'  
         [ , DECRYPTION BY PASSWORD = 'password' ]  
         [ , ENCRYPTION BY PASSWORD = 'password' ]    
      }  
    |  
      {   
        BINARY = private_key_bits  
         [ , DECRYPTION BY PASSWORD = 'password' ]  
         [ , ENCRYPTION BY PASSWORD = 'password' ]    
      }  
  
<date_options> ::=  
    START_DATE = 'datetime' | EXPIRY_DATE = 'datetime'  
-- Syntax for Parallel Data Warehouse  
  
CREATE CERTIFICATE certificate_name   
    { <generate_new_keys> | FROM <existing_keys> }  
    [ ; ]  
  
<generate_new_keys> ::=   
    WITH SUBJECT = 'certificate_subject_name'   
    [ , <date_options> [ ,...n ] ]   
  
<existing_keys> ::=   
    {   
      FILE ='path_to_file'  
      WITH PRIVATE KEY   
         (   
           FILE = 'path_to_private_key'  
           , DECRYPTION BY PASSWORD ='password'   
         )  
    }  
  
<date_options> ::=  
    START_DATE ='datetime' | EXPIRY_DATE ='datetime'  

Argumente

certificate_name
Der Name eines Zertifikats in der Datenbank.

AUTHORIZATION user_name
Der Name des Benutzers, der das Zertifikat besitzt.

ASSEMBLY assembly_name
Gibt eine signierte Assembly an, die bereits in die Datenbank geladen wurde.

[ EXECUTABLE ] FILE = 'path_to_file'
Gibt den vollständigen Pfad einschließlich des Dateinamens zur DER-codierten Datei an, die das Zertifikat enthält. Falls die EXECUTABLE-Option verwendet wird, handelt es sich bei der Datei um eine DLL-Datei, die mit dem Zertifikat signiert wurde. path_to_file kann ein lokaler Pfad oder ein UNC-Pfad zu einem Netzwerkspeicherort sein. Die Datei wird im Sicherheitskontext des SQL Server-Dienstkontos ausgeführt. Dieses Konto muss über die erforderlichen Dateisystemberechtigungen verfügen.

Wichtig

Das Erstellen eines Zertifikats aus einer Datei oder mithilfe von Dateien mit privaten Schlüsseln wird in Azure SQL-Datenbank nicht unterstützt.

BINARY = asn_encoded_certificate
Mit ASN verschlüsselte Zertifikatbytes, die als binäre Konstante angegeben sind.
Gilt für: SQL Server 2012 (11.x) und höher.

WITH FORMAT = 'PFX'
Gilt für: SQL Server 2022 (16.x) und höher
Gibt an, dass ein Zertifikat aus einer PFX-Datei generiert werden soll. Diese Klausel ist optional.

WITH PRIVATE KEY
Gibt an, dass der private Schlüssel des Zertifikats in SQL Server geladen wird. Diese Klausel ist ungültig, wenn das Zertifikat aus einer Assembly erstellt wird. Verwenden Sie ALTER CERTIFICATE, um den privaten Schlüssel eines aus einer Assembly erstellten Zertifikats zu laden.

FILE ='path_to_private_key'
Gibt den vollständigen Pfad einschließlich des Dateinamens für den privaten Schlüssel an. path_to_private_key kann ein lokaler Pfad oder ein UNC-Pfad zu einem Netzwerkspeicherort sein. Die Datei wird im Sicherheitskontext des SQL Server-Dienstkontos ausgeführt. Dieses Konto muss über die erforderlichen Dateisystemberechtigungen verfügen.

Wichtig

Diese Option ist weder in einer eigenständigen Datenbank noch in Azure SQL-Datenbank verfügbar.

BINARY = private_key_bits
Gilt für: SQL Server (ab SQL Server 2012 (11.x)) und Azure SQL-Datenbank.

Private Schlüsselbits, die als binäre Konstante angegeben sind. Diese Bits können in verschlüsselter Form vorhanden sein. Bei Verschlüsselung muss der Benutzer ein Entschlüsselungskennwort bereitstellen. Kennwortrichtlinienüberprüfungen werden für dieses Kennwort nicht ausgeführt. Die privaten Schlüsselbits müssen in einem PVK-Dateiformat vorliegen.

DECRYPTION BY PASSWORD = 'key_password'
Gibt das Kennwort an, das zum Entschlüsseln eines privaten Schlüssels erforderlich ist, der aus einer Datei abgerufen wird. Diese Klausel ist optional, wenn der private Schlüssel nicht durch ein Kennwort geschützt ist. Das Speichern eines privaten Schlüssels in einer Datei ohne Kennwortschutz wird nicht empfohlen. Falls zwar ein Kennwort erforderlich ist, jedoch keins angegeben wurde, löst die Anweisung einen Fehler aus.

ENCRYPTION BY PASSWORD = 'password'
Gibt das Kennwort an, mit dem der private Schlüssel verschlüsselt werden soll. Verwenden Sie diese Option nur, wenn Sie das Zertifikat mit einem Kennwort verschlüsseln möchten. Falls diese Klausel ausgelassen wird, wird der private Schlüssel mit dem Datenbank-Hauptschlüssel verschlüsselt. password muss den Anforderungen der Windows-Kennwortrichtlinien des Computers entsprechen, auf dem die Instanz von SQL Server ausgeführt wird. Weitere Informationen finden Sie unter Password Policy.

SUBJECT = 'certificate_subject_name'
Der Begriff subject (Betreff) bezieht sich auf ein Feld in den Metadaten des Zertifikats, wie es im X.509-Standard definiert ist. Er sollte nicht länger als 64 Zeichen sein. Diese Beschränkung wird für SQL Server unter Linux erzwungen. Der Antragsteller kann für SQL Server unter Windows bis zu 128 Zeichen lang sein. Antragstellernamen, die mehr als 128 Zeichen umfassen, werden bei der Speicherung im Katalog abgeschnitten. Das Blob (Binary Large Object), in dem das Zertifikat enthalten ist, behält jedoch den vollständigen Antragstellernamen bei.

START_DATE = 'datetime'
Das Datum, an dem das Zertifikat gültig wird. Falls nicht anders angegeben, wird das aktuelle Datum für START_DATE festgelegt. START_DATE ist in UTC-Zeit und kann in jedem Format angegeben werden, das in ein Datum und eine Uhrzeit konvertiert werden kann.

EXPIRY_DATE = 'datetime'
Das Datum, an dem das Zertifikat abläuft. Falls nicht anders angegeben, wird EXPIRY_DATE auf das Datum ein Jahr nach START_DATE festgelegt. EXPIRY_DATE ist in UTC-Zeit und kann in jedem Format angegeben werden, das in ein Datum und eine Uhrzeit konvertiert werden kann. SQL Server Service Broker überprüft das Ablaufdatum. Bei einer Sicherung mit Verschlüsselung unter Verwendung von Zertifikaten wird das Ablaufdatum ebenfalls überprüft. Hierbei wird die Erstellung einer neuen Sicherung mit einem abgelaufenen Zertifikat nicht zugelassen, Wiederherstellungen mit einem abgelaufenen Zertifikat sind jedoch möglich. Das Ablaufdatum wird jedoch nicht erzwungen, wenn das Zertifikat für die Datenbankverschlüsselung oder Always Encrypted verwendet wird.

ACTIVE FOR BEGIN_DIALOG = { ON | OFF }
Stellt das Zertifikat für den Initiator einer Service Broker-Dialogkonversation zur Verfügung. Der Standardwert ist ON.

Bemerkungen

Ein Zertifikat ist ein sicherungsfähiges Element auf Datenbankebene, das dem X.509-Standard entspricht und X.509 V1-Felder unterstützt. CREATE CERTIFICATE kann ein Zertifikat aus einer Datei, einer binären Konstante oder einer Assembly laden. Mit dieser Anweisung kann auch ein Schlüsselpaar generiert und ein selbstsigniertes Zertifikat erstellt werden.

Der private Schlüssel muss <= 2500 Byte in einem verschlüsselten Format betragen. Private Schlüssel, die von SQL Server generiert werden, umfassen 1024 Bit bis SQL Server 2014 (12.x) und ab SQL Server 2016 (13.x) 2048 Bit. Private Schlüssel, die aus einer externen Quelle importiert werden, haben eine minimale Länge von 384 Bits und eine maximale Länge von 4.096 Bits. Die Länge eines importierten privaten Schlüssels muss ein ganzzahliges Produkt von 64 Bits sein. Die für TDE verwendeten Zertifikate sind auf die private Schlüsselgröße von 3456 Bits beschränkt.

Die vollständige Seriennummer des Zertifikats wird gespeichert, aber nur die ersten 16 Byte werden in der sys.certificates-Katalogsicht angezeigt.

Das vollständige Feld „Zertifikataussteller“ wird zwar gespeichert, aber nur die ersten 884 Byte werden in der sys.certificates-Katalogsicht angezeigt.

Der private Schlüssel muss dem öffentlichen Schlüssel entsprechen, der mit certificate_name angegeben ist.

Beim Erstellen eines Zertifikats aus einem Container ist das Laden des privaten Schlüssels optional. Wenn von SQL Server jedoch ein selbstsigniertes Zertifikat generiert wird, wird der private Schlüssel immer erstellt. Standardmäßig ist der private Schlüssel mit dem Datenbank-Hauptschlüssel verschlüsselt. Falls kein Datenbank-Hauptschlüssel vorhanden und kein Kennwort angegeben ist, erzeugt die Anweisung einen Fehler.

Die ENCRYPTION BY PASSWORD-Option ist nicht erforderlich, wenn der private Schlüssel mit dem Datenbank-Hauptschlüssel verschlüsselt wird. Verwenden Sie diese Option nur, wenn der private Schlüssel mit einem Kennwort verschlüsselt wird. Falls kein Kennwort angegeben ist, wird der private Schlüssel des Zertifikats mit dem Datenbank-Hauptschlüssel verschlüsselt. Wenn der Datenbank-Hauptschlüssel nicht geöffnet werden kann, führt das Auslassen dieser Klausel zu einem Fehler.

Sie müssen kein Entschlüsselungskennwort angeben, wenn der private Schlüssel mit dem Datenbank-Hauptschlüssel verschlüsselt ist.

Hinweis

Die Ablaufdaten von Zertifikaten werden von integrierten Funktionen für die Verschlüsselung und Signierung nicht überprüft. Benutzer dieser Funktionen müssen entscheiden, wann die Ablaufdaten der Zertifikate überprüft werden sollen.

Sie können über die Funktionen CERTENCODED (Transact-SQL) und CERTPRIVATEKEY (Transact-SQL) eine binäre Beschreibung eines Zertifikats erstellen. Ein Beispiel für die Verwendung von CERTPRIVATEKEY und CERTENCODED zum Kopieren eines Zertifikats in eine andere Datenbank finden Sie in Beispiel B im Artikel CERTENCODED (Transact-SQL).

Die Algorithmen MD2, MD4, MD5, SHA und SHA-1 sind ab SQL Server 2016 (13.x) veraltet. Bis SQL Server 2016 (13.x) werden selbstsignierte Zertifikate mit SHA-1 erstellt. Ab SQL Server 2017 (14.x) werden selbstsignierte Zertifikate mit SHA-256 erstellt.

Berechtigungen

Erfordert die CREATE CERTIFICATE-Berechtigung für die Datenbank. Nur Windows-Anmeldenamen, SQL Server-Anmeldenamen und Anwendungsrollen können Zertifikate besitzen. Gruppen und Rollen können keine Zertifikate besitzen.

Beispiele

A. Erstellen eines selbstsignierten Zertifikats

Im folgenden Beispiel wird ein Zertifikat namens Shipping04 erstellt. Der private Schlüssel dieses Zertifikats wird mit einem Kennwort geschützt.

CREATE CERTIFICATE Shipping04   
   ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y'  
   WITH SUBJECT = 'Sammamish Shipping Records',   
   EXPIRY_DATE = '20201031';  
GO  

B. Erstellen eines Zertifikats aus einer Datei

Im folgenden Beispiel wird ein Zertifikat in der Datenbank erstellt, wobei das Schlüsselpaar aus Dateien geladen wird.

CREATE CERTIFICATE Shipping11   
    FROM FILE = 'c:\Shipping\Certs\Shipping11.cer'   
    WITH PRIVATE KEY (FILE = 'c:\Shipping\Certs\Shipping11.pvk',   
    DECRYPTION BY PASSWORD = 'sldkflk34et6gs%53#v00');  
GO   

Wichtig

Azure SQL-Datenbank bietet keine Unterstützung für das Erstellen eines Zertifikats aus einer Datei.

C. Erstellen eines Zertifikats aus einer signierten ausführbaren Datei

CREATE CERTIFICATE Shipping19   
    FROM EXECUTABLE FILE = 'c:\Shipping\Certs\Shipping19.dll';  
GO  

Alternativ können Sie eine Assembly aus der dll-Datei erstellen und anschließend ein Zertifikat aus der Assembly erstellen.

CREATE ASSEMBLY Shipping19   
    FROM 'c:\Shipping\Certs\Shipping19.dll'   
    WITH PERMISSION_SET = SAFE;  
GO  
CREATE CERTIFICATE Shipping19 FROM ASSEMBLY Shipping19;  
GO  

Wichtig

Azure SQL-Datenbank bietet keine Unterstützung für das Erstellen eines Zertifikats aus einer Datei.

Wichtig

Ab SQL Server 2017 (14.x) verhindert die Serverkonfigurationsoption „CLR Strict Security“ das Laden von Assemblys, ohne diese zuerst deren Sicherheit einzurichten. Laden Sie das Zertifikat, erstellen Sie einen Anmeldenamen, weisen Sie UNSAFE ASSEMBLY diesem Anmeldenamen zu, und laden Sie dann die Assembly.

D: Erstellen eines selbstsignierten Zertifikats

Das folgende Beispiel erstellt ein Zertifikat mit dem Namen Shipping04, ohne ein Verschlüsselungskennwort anzugeben. Dieses Beispiel kann mit Analytics-Plattformsystem (PDW) verwendet werden.

CREATE CERTIFICATE Shipping04   
   WITH SUBJECT = 'Sammamish Shipping Records';  
GO  

E. Erstellen eines Zertifikats aus einer PFX-Datei

CREATE CERTIFICATE Shipping04
    FROM FILE = 'c:\storedcerts\shipping04cert.pfx'
    WITH 
    FORMAT = 'PFX', 
	PRIVATE KEY (
        DECRYPTION BY PASSWORD = '9n34khUbhk$w4ecJH5gh'
	);  

Weitere Informationen

ALTER CERTIFICATE (Transact-SQL)
DROP CERTIFICATE (Transact-SQL)
BACKUP CERTIFICATE (Transact-SQL)
Verschlüsselungshierarchie
EVENTDATA (Transact-SQL)
CERTENCODED (Transact-SQL)
CERTPRIVATEKEY (Transact-SQL)
CERT_ID (Transact-SQL)
CERTPROPERTY (Transact-SQL)