CREATE CERTIFICATE (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

Agrega un certificado a una base de datos en SQL Server.

Esta función no es compatible con la exportación de la base de datos con el Marco de trabajo de la aplicación de capa de datos (DACFx). Debe quitar todos los certificados antes de exportar.

Nota:

En SQL Server 2022 (16.x), pueden crearse copias de seguridad de certificados con claves privadas o restaurarse directamente en archivos o blobs binarios mediante pares de claves públicas (PKCS) #12 o el formato de intercambio de información personal (PFX). Todos los certificados generados por el sistema tienen una intensidad mínima de RSA-3072 en SQL Server 2022 (16.x).

El formato PKCS #12 o PFX es un formato binario para almacenar el certificado de servidor, los certificados intermedios y la clave privada en un archivo. Los archivos PFX suelen tener extensiones como .pfx y .p12. Esto facilita a los clientes que cumplan las directrices de procedimientos recomendados de seguridad actuales y los estándares de cumplimiento que prohíben el cifrado RC4, eliminando la necesidad de usar herramientas de conversión como PVKConverter (para el formato PVK o DER).

Convenciones de sintaxis de Transact-SQL

Nota

El grupo de SQL sin servidor no admite esta sintaxis en Azure Synapse Analytics.

Sintaxis

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

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.

Argumentos

certificate_name
Es el nombre del certificado de la base de datos.

AUTHORIZATION user_name
Es el nombre del usuario propietario del certificado.

ASSEMBLY assembly_name
Especifica un ensamblado firmado que se ha cargado en la base de datos.

[ EXECUTABLE ] FILE = "ruta_al_archivo"
Especifica la ruta completa, incluido el nombre de archivo, de acceso a un archivo codificado con DER que contiene el certificado. Si se usa la opción EXECUTABLE, el archivo es una DLL firmada por el certificado. path_to_file puede ser una ruta de acceso local o una ruta UNC a una ubicación de red. Se accede al archivo en el contexto de seguridad de la cuenta de servicio de SQL Server. Esta cuenta debe disponer de los necesarios permisos de sistema de archivos.

Importante

Azure SQL Database no admite la creación de un certificado desde un archivo o mediante archivos de clave privada.

BINARY = asn_encoded_certificate
Bytes de certificado codificados por ASN especificados como una constante binaria.
Válido para : SQL Server 2012 (11.x) y versiones posteriores.

WITH FORMAT = 'PFX'
Se aplica a: SQL Server 2022 (16.x) y versiones posteriores
Especifica la generación de un certificado a partir de un archivo PFX. Esta cláusula es opcional.

WITH PRIVATE KEY
Especifica que la clave privada del certificado se ha cargado en SQL Server. Esta cláusula no es válida si el certificado se crea desde un ensamblado. Para cargar la clave privada de un certificado creado desde un ensamblado, use ALTER CERTIFICATE.

FILE ='path_to_private_key'
Especifica la ruta de acceso completa a la clave privada, incluido el nombre de archivo. path_to_private_key puede ser una ruta de acceso local o una ruta UNC a una ubicación de red. Se accede al archivo en el contexto de seguridad de la cuenta de servicio de SQL Server. Esta cuenta debe disponer de los necesarios permisos de sistema de archivos.

Importante

Esta opción no está disponible en una base de dato independiente o en Azure SQL Database.

BINARY = private_key_bits
Se aplica a: SQL Server (a partir de SQL Server 2012 (11.x)) y Azure SQL Database.

Bits de clave privada especificados como una constante binaria. Estos bits pueden estar en forma cifrada. Si están cifrados, el usuario debe proporcionar una contraseña de descifrado. No se realizan comprobaciones de directiva de contraseña en esta contraseña. Los bits de clave privada deben tener el formato de archivo PVK.

DECRYPTION BY PASSWORD = "código de acceso_de_clave"
Especifica la contraseña necesaria para descifrar una clave privada recuperada de un archivo. La cláusula es opcional si la clave privada está protegida por una contraseña NULL. No se recomienda guardar una clave privada de un archivo sin protección de contraseña. Si no se especifica una contraseña y es obligatorio hacerlo, se produce un error en la instrucción.

ENCRYPTION BY PASSWORD = 'password'
Especifica la contraseña usada para cifrar la clave privada. Utilice esta opción solo si desea cifrar el certificado con una contraseña. Si se omite esta cláusula, la clave privada se cifra usando la clave maestra de la base de datos. password debe cumplir los requisitos de la directiva de contraseñas de Windows del equipo que ejecuta la instancia de SQL Server. Para obtener más información, vea Password Policy.

SUBJECT = "nombre_del_asunto_del_certificado"
El término subject se refiere a un campo de asunto en los metadatos del certificado, según lo establecido en el estándar X.509. El contenido del asunto no debe tener más de 64 caracteres; este límite se aplica para SQL Server en Linux. Para SQL Server en Windows, este campo puede tener un máximo de 128 caracteres. Los asuntos que superen los 128 caracteres se truncan al almacenarlos en el catálogo, pero el objeto binario grande (BLOB) que contiene el certificado conserva el nombre de asunto completo.

START_DATE ="fecha_y_hora"
Es la fecha en la que el certificado comienza a ser válido. Si no se especifica, START_DATE coincide con la fecha actual. START_DATE se especifica en hora UTC y en cualquier formato que se pueda convertir a una fecha y hora.

EXPIRY_DATE ="fecha_y_hora"
Es la fecha en la que expira el certificado. Si no se especifica, EXPIRY_DATE es una fecha un año posterior a la indicada en START_DATE. EXPIRY_DATE se especifica en hora UTC y en cualquier formato que se pueda convertir a una fecha y hora. SQL Server Service Broker comprueba la fecha de expiración, Backup con cifrado que usa certificados también comprueba la fecha de expiración y no permitirá que una nueva copia de seguridad se cree con un certificado caducado, pero permitirá restauraciones con un certificado caducado. Sin embargo, no se exige la expiración cuando el certificado se usa para el cifrado de base de datos o para Always Encrypted.

ACTIVE FOR BEGIN_DIALOG = { ON | OFF }
Hace que el certificado esté disponible para el iniciador de una conversación de diálogo de Service Broker. El valor predeterminado es ON.

Comentarios

Un certificado es un elemento protegible de nivel de base de datos que sigue el estándar X.509 y admite los campos V1 de X.509. CREATE CERTIFICATE puede cargar un certificado desde un archivo, una constante binaria o un ensamblado. Esta instrucción también puede generar un par de claves y crear un certificado con firma personal.

La clave privada debe ser <= 2500 bytes en formato cifrado. Las claves privadas generadas por SQL Server tienen una longitud de 1024 bits hasta SQL Server 2014 (12.x) y tienen 2048 bits a partir de SQL Server 2016 (13.x). Las claves privadas importadas de un origen externo presentan una longitud mínima de 384 bits y una máxima de 4.096 bits. La longitud de una clave privada importada debe ser un entero múltiplo de 64 bits. Los certificados que se usan para TDE tienen un límite de tamaño de clave privada de 3456 bits.

Se almacena el número de serie completo del certificado, pero solo se muestran los 16 primeros bytes en la vista de catálogo sys.certificates.

Se almacena todo el campo Emisor de certificado, pero solo se muestran los primeros 884 bytes en la vista de catálogo sys.certificates.

La clave privada debe corresponderse con la clave pública especificada por certificate_name.

Cuando se crea un certificado desde un contenedor, es opcional cargar la clave privada. Pero cuando SQL Server genera un certificado con firma personal, siempre se creará la clave privada. De manera predeterminada, la clave privada se cifra con la clave maestra de base de datos. Si no existe una clave maestra de base de datos y no se especifica una contraseña, se produce un error en la instrucción.

La opción ENCRYPTION BY PASSWORD no es necesaria si la clave privada está cifrada con la clave maestra de la base de datos. Use esta opción solo si se cifra la clave privada con una contraseña. Si no se especifica una contraseña, la clave privada del certificado se cifrará con la clave maestra de base de datos. Si no se puede abrir la clave maestra de la base de datos, se produce un error al abrir esta cláusula.

No es necesario especificar una contraseña de descifrado si se cifra la clave privada con la clave maestra de base de datos.

Nota:

Las funciones integradas para el cifrado y firma no comprueban las fechas de expiración de los certificados. Los usuarios de estas funciones deben decidir cuándo comprobar la expiración de los certificados.

Se puede crear una descripción binaria de un certificado mediante las funciones CERTENCODED (Transact-SQL) y CERTPRIVATEKEY (Transact-SQL). Para ver un ejemplo donde se usa CERTPRIVATEKEY y CERTENCODED para copiar un certificado en otra base de datos, consulte el ejemplo B del artículo CERTENCODED (Transact-SQL).

Los algoritmos MD2, MD4, MD5, SHA y SHA1 están en desuso en SQL Server 2016 (13.x). Hasta SQL Server 2016 (13.x), un certificado autofirmado se creaba mediante SHA1. A partir de SQL Server 2017 (14.x), un certificado autofirmado se crea mediante SHA2_256.

Permisos

Debe tener el permiso CREATE CERTIFICATE para la base de datos. Solo los inicios de sesión de Windows, los inicios de sesión de SQL Server y los roles de aplicación pueden poseer certificados. Los grupos y roles no pueden poseer los certificados.

Ejemplos

A. Crear un certificado autofirmado

En el siguiente ejemplo se crea un certificado denominado Shipping04. La clave privada de este certificado está protegida con una contraseña.

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

B. Crear un certificado desde un archivo

En el ejemplo siguiente se crea un certificado en la base de datos y se carga el par de claves desde los archivos.

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

Azure SQL Database no admite la creación de un certificado desde un archivo.

C. Crear un certificado desde un archivo ejecutable firmado

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

Como alternativa, puede crear un ensamblado desde el archivo dll y crear un certificado desde el ensamblado.

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

Importante

Azure SQL Database no admite la creación de un certificado desde un archivo.

Importante

A partir de SQL Server 2017 (14.x), la opción de configuración del servidor "CLR strict security" evita la carga de ensamblados sin configurar primero su seguridad. Cargue el certificado, cree un inicio de sesión a partir del mismo, conceda UNSAFE ASSEMBLY a ese inicio de sesión y, a continuación, cargue el ensamblado.

D. Crear un certificado autofirmado

En este ejemplo se crea un certificado denominado Shipping04 sin especificar una contraseña de cifrado. Este ejemplo se puede usar con Sistema de la plataforma de análisis (PDW).

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

E. Crear un certificado desde un archivo PFX

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

Vea también

ALTER CERTIFICATE (Transact-SQL)
DROP CERTIFICATE (Transact-SQL)
BACKUP CERTIFICATE (Transact-SQL)
Jerarquía de cifrado
EVENTDATA (Transact-SQL)
CERTENCODED (Transact-SQL)
CERTPRIVATEKEY (Transact-SQL)
CERT_ID (Transact-SQL)
CERTPROPERTY (Transact-SQL)