Partage via


CREATE CERTIFICATE (Transact-SQL)

S’applique à : SQL Server base de données Azure SQL Azure SQL Managed Instance Azure Synapse Analytics

Permet d'ajouter un certificat à une base de données dans SQL Server.

Cette fonctionnalité est incompatible avec l'exportation de base de données à l'aide de l'infrastructure d'application de la couche Données. Vous devez supprimer tous les certificats avant l'exportation.

Notes

Dans SQL Server 2022 (16.x), les certificats avec des clés privées peuvent être sauvegardés directement dans des fichiers ou des blobs binaires, ou restaurés à partir de ceux-ci, à l’aide des paires de clés publiques (PKCS) #12 ou du format PFX (Personal Information Exchange). Tous les certificats générés par le système ont une force minimale de RSA-3072 dans SQL Server 2022 (16.x).

Le format PKCS #12 ou PFX est un format binaire permettant de stocker le certificat de serveur, tous les certificats intermédiaires et la clé privée dans un fichier. Les fichiers PFX comportent généralement des extensions du type .pfx et .p12. Cela facilite l’adhésion des clients aux meilleures pratiques de sécurité actuelles et aux normes de conformité qui interdisent le chiffrement RC4. Il n’est en effet plus nécessaire d’utiliser des outils de conversion comme PVKConverter (pour le format PVK ou DER).

Conventions de la syntaxe Transact-SQL

Notes

Cette syntaxe n’est pas prise en charge par le pool SQL serverless dans Azure Synapse Analytics.

Syntaxe

-- 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'  

Arguments

certificate_name
Nom du certificat dans la base de données.

AUTHORIZATION user_name
Nom de l’utilisateur auquel appartient ce certificat.

ASSEMBLY assembly_name
Spécifie un assembly signé qui a déjà été chargé dans la base de données.

[ EXECUTABLE ] FILE = 'path_to_file'
Spécifie le chemin d'accès complet, y compris le nom de fichier, d'un fichier encodé DER qui contient le certificat. Si l'option EXECUTABLE est utilisée, le fichier est une DLL signée par le certificat. path_to_file peut être un chemin local ou un chemin UNC d’un emplacement réseau. L’accès au fichier s’effectue dans le contexte de sécurité du compte de service SQL Server. Ce compte doit posséder les autorisations de système de fichiers requises.

Important

Azure SQL Database ne prend pas en charge la création d’un certificat à partir d’un fichier ou à l’aide de fichiers de clé privée.

BINARY = asn_encoded_certificate
Bits de certificat encodés par ASN spécifiés comme constante binaire.
S’applique à : SQL Server 2012 (11.x) et versions ultérieures.

WITH FORMAT = ’PFX’
S’applique à : SQL Server 2022 (16.x) et versions ultérieures
Spécifie la génération d’un certificat à partir d’un fichier PFX. Cette clause est facultative.

WITH PRIVATE KEY
Spécifie que la clé privée du certificat est chargée dans SQL Server. Cette clause est invalide lorsque le certificat est créé à partir d’un assembly. Pour charger la clé privée d’un certificat créé à partir d’un assembly, utilisez ALTER CERTIFICATE.

FILE ='path_to_private_key'
Spécifie le chemin d'accès complet, y compris le nom du fichier, à la clé privée. path_to_private_key peut être un chemin local ou un chemin UNC d’un emplacement réseau. L’accès au fichier s’effectue dans le contexte de sécurité du compte de service SQL Server. Ce compte doit posséder les autorisations de système de fichiers nécessaires.

Important

Cette option n’est pas disponible dans une base de données autonome ni dans Azure SQL Database.

BINARY = private_key_bits
S’applique à : SQL Server (à compter de SQL Server 2012 (11.x)) et Azure SQL Database.

Bits de clé privée spécifiés comme constante binaire. Ces bits peuvent être sous forme chiffrée. Si chiffrés, l'utilisateur doit fournir un mot de passe de déchiffrement. Les contrôles de stratégie de mot de passe ne sont pas exécutés sur ce mot de passe. Les bits de clé privée doivent être dans un format de fichier PVK.

DECRYPTION BY PASSWORD = 'key_password'
Spécifie le mot de passe requis pour déchiffrer une clé privée récupérée à partir d'un fichier. Cette clause est facultative si la clé privée est protégée par un mot de passe vide. Il n’est pas recommandé d’enregistrer une clé privée dans un fichier sans protection par mot de passe. Si un mot de passe est nécessaire mais qu’aucun mot de passe n’est spécifié, l’instruction échoue.

ENCRYPTION BY PASSWORD = 'password'
Spécifie le mot de passe utilisé pour chiffrer la clé privée. Utilisez cette option seulement si vous voulez chiffrer le certificat à l'aide d'un mot de passe. Si cette clause est omise, la clé privée est chiffrée à l’aide de la clé principale de base de données. password doit satisfaire aux critères de la stratégie de mot de passe Windows de l’ordinateur qui exécute l’instance de SQL Server. Pour plus d'informations, consultez Password Policy.

SUBJECT = 'certificate_subject_name'
Le terme subject fait référence à un champ dans les métadonnées du certificat, tel que défini dans la norme X.509. L’objet ne doit pas faire plus de 64 caractères, et cette limite est appliquée pour SQL Server sur Linux. Pour SQL Server sur Windows, l’objet peut contenir jusqu’à 128 caractères. Les objets de plus de 128 caractères sont tronqués quand ils sont stockés dans le catalogue, mais l’objet blob (Binary Large Object) qui contient le certificat conserve le nom complet de l’objet.

START_DATE = 'datetime'
Date à laquelle le certificat devient valide. Si cette date n’est pas spécifiée, la date actuelle est attribuée à START_DATE. START_DATE utilise l'heure UTC et peut être spécifié selon tout format convertible en date et heure.

EXPIRY_DATE = 'datetime'
Date à laquelle le certificat expire. Si cette date n’est pas spécifiée, EXPIRY_DATE a une valeur égale à un an après START_DATE. EXPIRY_DATE utilise l'heure UTC et peut être spécifié selon tout format convertible en date et heure. SQL Server Service Broker vérifie la date d’expiration. La sauvegarde avec chiffrement à l’aide de certificats vérifie également la date d’expiration : avec un certificat expiré, la création d’une sauvegarde n’est pas autorisée, contrairement aux restaurations. Toutefois, l’expiration n’est pas appliquée quand le certificat est utilisé pour le chiffrement de la base de données ou le chiffrement Always Encrypted.

ACTIVE FOR BEGIN_DIALOG = { ON | OFF }
Met le certificat à disposition de l'initiateur d'une conversation Service Broker. La valeur par défaut est ON.

Notes

Un certificat est un élément sécurisable de niveau base de données qui suit la norme X.509 et prend en charge les champs X.509 V1. CREATE CERTIFICATE permet de charger un certificat à partir d’un fichier, d’une constante binaire ou d’un assembly. Cette instruction peut également générer une paire de clés et créer un certificat autosigné.

La clé privée doit être <= 2500 octets dans un format chiffré. Les clés privées générées par SQL Server font 1024 bits jusqu’à SQL Server 2014 (12.x), et 2 048 bits à compter de SQL Server 2016 (13.x). Les clés privées importées à partir d'une source externe ont une longueur minimale de 384 bits et une longueur maximale de 4 096 bits. La longueur d'une clé privée importée doit être un entier multiple de 64 bits. Les certificats utilisés pour le chiffrement transparent des données sont limités à une taille de clé privée de 3456 bits.

Le numéro de série entier du certificat est stocké, mais seuls les 16 premiers octets apparaissent dans la vue de catalogue sys.certificates.

Le champ entier de l’émetteur du certificat est stocké, mais seuls les 884 premiers octets apparaissent dans la vue de catalogue sys.certificates.

La clé privée doit correspondre à la clé publique spécifiée par certificate_name.

Lorsque vous créez un certificat à partir d'un conteneur, le chargement de la clé privée est facultatif. En revanche, lorsque SQL Server génère un certificat autosigné, la clé privée est toujours créée. Par défaut, la clé privée est chiffrée au moyen de la clé principale de base de données. Si la clé principale de base de données n’existe pas et qu’aucun mot de passe n’est spécifié, l’instruction échoue.

L’option ENCRYPTION BY PASSWORD n’est pas requise quand la clé privée est chiffrée à l’aide de la clé principale de base de données. Utilisez cette option seulement quand la clé privée est chiffrée à l’aide d’un mot de passe. Si aucun mot de passe n'est spécifié, la clé privée du certificat sera chiffrée à l'aide de la clé principale de base de données. Si la clé principale de la base de données ne peut pas être ouverte et que cette clause n’est pas spécifiée, une erreur se produit.

Il n’est pas nécessaire de spécifier un mot de passe de déchiffrement lorsque la clé privée est chiffrée au moyen de la clé principale de base de données.

Notes

Les fonctions intégrées de chiffrement et de signature ne vérifient pas les dates d'expiration des certificats. Les utilisateurs de ces fonctions doivent décider quand vérifier l'expiration des certificats.

Vous pouvez créer une description binaire d’un certificat à l’aide des fonctions CERTENCODED (Transact-SQL) et CERTPRIVATEKEY (Transact-SQL). Pour obtenir un exemple qui utilise CERTPRIVATEKEY et CERTENCODED afin de copier un certificat dans une autre base de données, consultez l’exemple B dans l’article CERTENCODED (Transact-SQL).

Les algorithmes MD2, MD4, MD5, SHA et SHA1 sont dépréciés dans SQL Server 2016 (13.x). Jusqu’à SQL Server 2016 (13.x), un certificat auto-signé est créé à l’aide de l’algorithme SHA1. À partir de SQL Server 2017 (14.x), un certificat auto-signé est créé à l’aide de l’algorithme SHA2_256.

Autorisations

Requiert l'autorisation CREATE CERTIFICATE sur la base de données. Les connexions Windows, les connexions SQL Server et les rôles d’application sont les seuls à pouvoir posséder des certificats. Les groupes et les rôles ne peuvent pas posséder de certificats.

Exemples

R. Création d'un certificat auto-signé

L'exemple suivant crée un certificat nommé Shipping04. La clé privée de ce certificat est protégée à l'aide d'un mot de passe.

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

B. Création d'un certificat à partir d'un fichier

L'exemple ci-dessous crée un certificat dans la base de données en chargeant la paire de clés à partir de fichiers.

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   

Important

Azure SQL Database ne prend pas en charge la création d’un certificat à partir d’un fichier.

C. Création d'un certificat à partir d'un fichier exécutable signé

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

Une autre méthode consiste à créer un assembly à partir du fichier dll, puis à créer un certificat à partir de l'assembly.

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

Important

Azure SQL Database ne prend pas en charge la création d’un certificat à partir d’un fichier.

Important

À compter de SQL Server 2017 (14.x), l’option de configuration de serveur 'CLR strict security' empêche le chargement d’assemblys sans avoir d’abord défini les paramètres de sécurité les concernant. Chargez le certificat, créez une connexion à partir de celui-ci, autorisez UNSAFE ASSEMBLY pour cette connexion, puis chargez l’assembly.

D. Création d'un certificat auto-signé

L’exemple suivant crée un certificat nommé Shipping04 sans spécifier de mot de passe de chiffrement. Il est utilisable avec Analytics Platform System (PDW).

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

E. Création d’un certificat à partir d’un fichier PFX

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

Voir aussi

ALTER CERTIFICATE (Transact-SQL)
DROP CERTIFICATE (Transact-SQL)
BACKUP CERTIFICATE (Transact-SQL)
Hiérarchie de chiffrement
EVENTDATA (Transact-SQL)
CERTENCODED (Transact-SQL)
CERTPRIVATEKEY (Transact-SQL)
CERT_ID (Transact-SQL)
CERTPROPERTY (Transact-SQL)