CREATE CERTIFICATE (Transact-SQL)

Si applica a:SQL Server database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics

Aggiunge un certificato a un database in SQL Server.

Questa funzionalità non è compatibile con l'esportazione del database mediante Data Tier Application Framework (DACFx). Prima dell'esportazione, è necessario eliminare tutti i certificati.

Nota

In SQL Server 2022 (16.x), i certificati con chiavi private possono essere sottoposti a backup o ripristinati direttamente da e verso file o BLOB binari usando il formato PKCS (Public Key Pair) #12 o PFX (Personal Information Exchange). Tutti i certificati generati dal sistema hanno un livello minimo di attendibilità RSA-3072 in SQL Server 2022 (16.x).

Il formato PKCS #12 o PFX è un formato binario usato per archiviare il certificato del server, tutti i certificati intermedi e la chiave privata in un unico file. Generalmente, l'estensione dei file PFX è .pfx o .p12. In questo modo, i clienti possono rispettare le linee guida correnti relative alle procedure consigliate per la sicurezza e gli standard di conformità che vietano la crittografia RC4 senza dover necessariamente usare strumenti di conversione come PVKConverter (per il formato PVK o DER).

Convenzioni di sintassi Transact-SQL

Nota

Questa sintassi non è supportata da pool SQL serverless in Azure Synapse Analytics.

Sintassi

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

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

Argomenti

certificate_name
Nome del certificato nel database.

AUTHORIZATION user_name
Nome dell'utente proprietario del certificato.

ASSEMBLY assembly_name
Specifica un assembly firmato già caricato nel database.

[ EXECUTABLE ] FILE = 'path_to_file'
Specifica il percorso completo, nome di file incluso, del file con codifica DER che contiene il certificato. Se viene utilizzata l'opzione EXECUTABLE, il file è una DLL firmata dal certificato. path_to_file può essere un percorso locale o un percorso UNC di rete. L'accesso al file viene eseguito nel contesto di protezione dell'account del servizio di SQL Server. L'account deve disporre delle necessarie autorizzazioni per il file system.

Importante

Database SQL di Azure non supporta la creazione di un certificato da un file o tramite file di chiave privata.

BINARY = asn_encoded_certificate
Byte di un certificato con codifica ASN specificati come costante binaria.
Si applica a: SQL Server 2012 (11.x) e versioni successive.

WITH FORMAT = 'PFX'
Si applica a: SQL Server 2022 (16.x) e versioni successive
Specifica la generazione di un certificato da un file PFX. La clausola è facoltativa.

WITH PRIVATE KEY
Specifica che la chiave privata del certificato viene caricata in SQL Server. Questa clausola non è valida quando il certificato viene creato da un assembly. Per caricare la chiave privata di un certificato creato da un assembly, usare ALTER CERTIFICATE.

FILE ='path_to_private_key'
Specifica il percorso completo, compreso il nome del file, per la chiave privata. path_to_private_key può essere un percorso locale o un percorso UNC di rete. L'accesso al file viene eseguito nel contesto di protezione dell'account del servizio di SQL Server. L'account deve disporre delle necessarie autorizzazioni per il file system.

Importante

Questa opzione non è disponibile in un database indipendente o nel database SQL di Azure.

BINARY = private_key_bits
Si applica a: SQL Server (a partire da SQL Server 2012 (11.x)) e al database SQL di Azure.

Bit della chiave privata specificati come costante binaria. Questi bit possono essere in formato crittografato. Se crittografati, l'utente deve fornire una password di decrittografia. I controlli dei criteri della password non vengono eseguiti su questa password. I bit della chiave privata devono essere in un formato di file PVK.

DECRYPTION BY PASSWORD = 'key_password'
Specifica la password necessaria per decrittografare la chiave privata recuperata da un file. Questa clausola è facoltativa se la chiave privata è protetta con una password Null. Non è consigliabile salvare una chiave privata in un file senza proteggerla con una password. Se è richiesta una password ma questa non viene specificata, l'istruzione ha esito negativo.

ENCRYPTION BY PASSWORD = 'password'
Specifica la password usata per crittografare la chiave privata. Utilizzare questa opzione solo se si desidera crittografare il certificato con una password. Se questa clausola viene omessa, la chiave privata viene crittografata con la chiave master del database. password deve soddisfare i requisiti per i criteri password di Windows del computer che esegue l'istanza di SQL Server. Per ulteriori informazioni, vedere Password Policy.

SUBJECT = 'certificate_subject_name'
Il termine subject (oggetto) fa riferimento a un campo nei metadati del certificato, conformemente ai requisiti dello standard X.509. Non deve essere lungo più di 64 caratteri e questo limite viene applicato per SQL Server in Linux. Per SQL Server in Windows, può essere costituito da un massimo di 128 caratteri. Gli oggetti con lunghezza maggiore di 128 caratteri vengono troncati al momento dell'archiviazione nel catalogo, ma nell'oggetto binario di grandi dimensioni (BLOB) contenente il certificato verrà mantenuto il nome di oggetto completo.

START_DATE = 'datetime'
Data di inizio validità del certificato. Se non si specifica una data, per il parametro START_DATE viene impostata la data corrente. START_DATE è in ora UTC e si può specificare in un qualsiasi formato convertibile in una data e ora.

EXPIRY_DATE = 'datetime'
Data di scadenza del certificato. Se non si specifica una data, per il parametro EXPIRY_DATE viene impostata una data di scadenza corrispondente a un anno dopo START_DATE. EXPIRY_DATE è in ora UTC e si può specificare in un qualsiasi formato convertibile in una data e ora. SQL Server Service Broker controlla la data di scadenza. Anche il backup con la crittografia tramite certificati controlla la data di scadenza e non consentirà un nuovo backup da creare con un certificato scaduto, ma consentirà operazioni di ripristino con un certificato scaduto. Tuttavia, la scadenza non viene applicata quando il certificato viene usato per la crittografia del database o Always Encrypted.

ACTIVE FOR BEGIN_DIALOG = { ON | OFF }
Rende il certificato disponibile per un initiator di una conversazione di dialogo di Service Broker. Il valore predefinito è ON.

Osservazioni:

Un certificato è un'entità a protezione diretta a livello di database conforme allo standard X.509 e che supporta i campi della specifica X.509 V1. CREATE CERTIFICATE consente di caricare un certificato da un file, una costante binaria o un assembly. e può inoltre essere utilizzata per generare una coppia di chiavi e creare un certificato autofirmato.

La chiave privata deve essere <= 2500 byte nel formato crittografato. Le chiavi private generate da SQL Server sono a 1024 bit da SQL Server 2014 (12.x) e a 2048 bit a partire da SQL Server 2016 (13.x). Le chiavi private importate da un'origine esterna devono avere una lunghezza compresa tra 384 bit e 4,096 bit. La lunghezza di una chiave privata importata deve essere un valore intero multiplo di 64 bit. I certificati usati per TDE sono limitati a chiavi private con dimensioni di 3456 bit.

Il numero di serie completo del certificato viene archiviato, ma solo i primi 16 byte vengono visualizzati nella vista del catalogo sys.certificates.

Il campo dell'autorità di certificazione completo viene archiviato, ma solo i primi 884 byte vengono visualizzati nella vista del catalogo sys.certificates.

La chiave privata deve corrispondere alla chiave pubblica specificata da certificate_name.

Quando si crea un certificato da un contenitore, il caricamento della chiave privata è facoltativo. La chiave privata viene invece sempre creata quando SQL Server genera un certificato autofirmato. Per impostazione predefinita, la chiave privata viene crittografata con la chiave master del database. Se la chiave master del database non esiste e non si specifica una password, l'istruzione ha esito negativo.

L'opzione ENCRYPTION BY PASSWORD non è richiesta se la chiave privata è crittografata con la chiave master del database. Usare questa opzione solo se la chiave privata viene crittografata con una password. Se non si specifica la password, la chiave privata del certificato verrà crittografata con la chiave master del database. Se si omette questa clausola e non è possibile aprire la chiave master del database, viene generato un errore.

Non è necessario specificare una password di decrittografia quando la chiave privata è crittografata con la chiave master del database.

Nota

Le funzioni predefinite per la crittografia e la firma non controllano le date di scadenza dei certificati. Gli utenti di queste funzioni dovranno decidere autonomamente quando eseguire il controllo delle scadenze dei certificati.

È possibile creare una descrizione binaria di un certificato usando le funzioni CERTENCODED (Transact-SQL) e CERTPRIVATEKEY (Transact-SQL). Per un esempio che usa CERTPRIVATEKEY e CERTENCODED per copiare un certificato in un altro database, vedere l'esempio B nell'articolo CERTENCODED (Transact-SQL).

Gli algoritmi MD2, MD4, MD5, SHA e SHA1 sono deprecati in SQL Server 2016 (13.x). Fino a SQL Server 2016 (13.x), un certificato autofirmato viene creato con SHA1. A partire da SQL Server 2017 (14.x), un certificato autofirmato viene creato usando SHA2_256.

Autorizzazioni

È richiesta l'autorizzazione CREATE CERTIFICATE per il database. Solo gli account di accesso di Windows e di SQL Server e i ruoli applicazione possono disporre di certificati. I gruppi e i ruoli non possono disporre di certificati.

Esempi

R. Creazione di un certificato autofirmato

Nell'esempio seguente viene creato un certificato denominato Shipping04. La chiave privata di questo certificato è protetta con una password.

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

B. Creazione di un certificato da un file

Nell'esempio seguente viene creato un certificato nel database e la coppia di chiavi viene caricata da file.

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   

Importante

Database SQL di Azure non supporta la creazione di un certificato da un file.

C. Creazione di un certificato da un file eseguibile firmato

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

In alternativa, è possibile creare un assembly dal file dll e quindi creare un certificato dall'assembly.

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

Importante

Database SQL di Azure non supporta la creazione di un certificato da un file.

Importante

A partire da SQL Server 2017 (14.x), l'opzione di configurazione del server "CLR Strict Security" impedisce il caricamento di assembly senza aver prima configurato la sicurezza. Caricare il certificato, creare un account di accesso da quest'ultimo, concedere l'autorizzazione UNSAFE ASSEMBLY a tale account di accesso e quindi caricare l'assembly.

D. Creazione di un certificato autofirmato

Nell'esempio seguente viene creato un certificato denominato Shipping04 senza specificare una password di crittografia. Questo esempio può essere usato con Analytics Platform System (PDW).

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

E. Creazione di un certificato da un file PFX

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

Vedi anche

ALTER CERTIFICATE (Transact-SQL)
DROP CERTIFICATE (Transact-SQL)
BACKUP CERTIFICATE (Transact-SQL)
Gerarchia di crittografia
EVENTDATA (Transact-SQL)
CERTENCODED (Transact-SQL)
CERTPRIVATEKEY (Transact-SQL)
CERT_ID (Transact-SQL)
CERTPROPERTY (Transact-SQL)