Certificados en SQL Server

Certificados en SQL Server

Un certificado es un asegurable a nivel de base de datos que sigue el estándar X.509 y admite campos X.509 V1.
La instrucción CREATE CERTIFICATE permite cargar un certificado desde un archivo, una constante binaria o un ensamblado. Esta declaración también puede generar un par de claves y crear un certificado autofirmado.

Características de las claves

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 una longitud de 2048 bits a partir de SQL Server 2016 (13.x).
Las claves privadas importadas de una fuente externa tienen una longitud mínima de 384 bits y una longitud máxima de 4.096 bits. La longitud de una clave privada importada debe ser un múltiplo entero de 64 bits.

Creando certificados en SQL Server

Instrucción Create Certificate

CREATE CERTIFICATE NombreCertificado [ AUTHORIZATION Usuario ]
[ ENCRYPTION BY PASSWORD = ‘password’ ]
WITH SUBJECT = ‘certificate_subject_name’
START_DATE = ‘datetime’ | EXPIRY_DATE = ‘datetime’
go
Donde:
NombreCertificado, especifica el nombre del certificado
[ AUTHORIZATION Usuario ] es el usuario que es dueño del certificado. (Ver usuarios de Base de Datos)
[ ENCRYPTION BY PASSWORD = ‘password’ ], especifica el password.
WITH SUBJECT = ‘Descripción’, especifica la descripción del certificado.
START_DATE = ‘datetime’ | EXPIRY_DATE = ‘datetime’, opciones de fecha de inicio y de finalización de la validez del certificado.

Ejemplos

Usando la base de datos Northwind
use Northwind
go

Ejercicio 1

Crear un certificado con fecha de vencimiento en 2025
set dateformat dmy
go
Create certificate TrainerCertificado
encryption by password = ‘TSQLCertificadoSP’
with subject = ‘Certificado Trainer’,
Expiry_date = ’15/05/2025′
go

Para ver el certificado creado
select name, subject, issuer_name,
start_date, expiry_date
from sys.certificates
go

Ejercicio 2

Crear un certificado sin password, si no se tiene creada una clave maestra no es posible crear un certificado sin password.
Create certificate CertificadoSinPass
with subject = ‘Certificado libre’
go
/* Mensaje
Msg 15581, Level 16, State 1, Line 54
Please create a master key in the database or open the master key
in the session before performing this operation. */

Crear una clave maestra.

Create master key encryption by password =’Cl@veS3cr3t@_LQS’
go
Para más información: Ver encriptado de copias de seguridad
Ahora si se puede crear el certificado sin password
Create certificate CertificadoSinPass
with subject = ‘Certificado libre’
go
Para visualizar los certificados creados
select name, subject, issuer_name,
start_date, expiry_date
from sys.certificates
go

Ejercicio 3

Crear un certificado en base a un archivo, este ejercicio hace necesario que se tenga el certificado y el archivo con la clave. Por obvias razones no se comparte el archivo.
CREATE CERTIFICATE CertificadoTrainerVentas
from file = ‘E:\Ventas\Certificados\CerVentasT.cer’
WITH private key
(FILE = ‘E:\Ventas\Certificados\CerVentasT.pvk’,
DECRYPTION BY PASSWORD = ‘cl@v3_C3rt1f1c@do_Tr@1n3rSQL’)
go

Ejercicio 4

Crear un certificado en base a un ensamblado
En primer lugar, crear el ensamblado
Create Assembly VentasEnsTQ
FROM ‘ E:\Ventas\Certificados\VentasEnsTQ.dll’
WITH PERMISSION_SET = SAFE
go
Ahora se puede crear el certificado
Create certificate certVentasEnsTQ FROM ASSEMBLY VentasEnsTQ
go

Modificación de los certificados

Los certificados se puede modificar usando la instrucción Alter Certificate, con esta instrucción se puede cambiar la contraseña utilizada para cifrar la clave privada de un certificado, elimina la clave privada o importa la clave privada si no hay ninguna. También se puede cambiar la disponibilidad de un certificado al Service Broker.

Instrucción Alter certificate
ALTER CERTIFICATE NombreCertificado
REMOVE PRIVATE KEY
| WITH PRIVATE KEY ( )
| WITH ACTIVE FOR BEGIN_DIALOG = { ON | OFF }

::=
{ { FILE = ‘path_to_private_key’ | BINARY = private_key_bits }
[ , DECRYPTION BY PASSWORD = ‘password actual’ ]
[ , ENCRYPTION BY PASSWORD = ‘nuevo password’ ]
} | { [ DECRYPTION BY PASSWORD = ‘password actual’ ]
[ [ , ] ENCRYPTION BY PASSWORD = ‘nuevo password’ ]}

Ejercicio 5

Quitar la clave privada del certificado TrainerCertificado
Alter certificate TrainerCertificado
remove private key
go

Eliminar los certificados

La instrucción Drop Certificate permite eliminar los certificados
Instrucción Drop certificate
Drop certificate NombreCertificado
Donde: NombreCertificado, es el nombre del certificado a eliminar de la base de datos.

Ejercicio 6

Eliminar el certificado TrainerCertificado
Drop certificate TrainerCertificado
go