Azure KeyVault nos permite importar los certificados que tenemos de forma local (on-premise). Y podemos seguir usando el certificado para las mismas funciones pero con las ventajas que nos ofrece Azure KeyVault.

El certificado a importar debe contener la llave privada, de lo contrario no tendría mucho sentido importarlo a nuestro contenedor de llaves en Azure KeyVault. Una vez que lo importemos tenemos acceso por medio del API que expone el servicio.

Vamos a ver como realizar la importación hacia nuestro contenedor de llaves en Azure KeyVault por medio de código. Vamos a realizar una aplicación en WPF que permita seleccionar un certificado y hacer la importación directamente.

Aquí el código completo

Preparando el Certificado

Antes de importar el certificado debemos asegurarnos de tener todo el certificado completo (la parte publica y privada), nos podemos encontrar que nuestro certificado puede estar en distintas extensiones e incluso el contenido puede estar codificado de formas distintas. Podemos encontrarnos con estas extensiones:

  • .csr: Este solo es la solicitud del certificado, esto no sirve, solo contiene la parte publica.
  • .pem: Puede contener solo la parte publica y/o la parte privada, hay que abrirlo con un editor de texto y ver lo que contiene. Este si puede servir.
  • .key: Lo mismo que el anterior pero seguramente solo trae la parte privada.
  • .pkcs12.pfx.p12: Es probable que traiga todo lo que se requiere. Pero hay que validarlo, este archivo NO se puede abrir con un editor de texto. Hay que ejecutar un comando con openssl para validar.
  • .der: De nuevo hay que validar que contenga la parte privada con un comando de openssl.
  • .cert.cer.crt: Puede contener solo la parte publica y/o la parte privada. Y puede estar codificado sobre der o pem.
  • .p7b: Solo la parte publica
  • .crl: Solo la parte publica

Encodings

Independiente de la extensión del archivo nos podemos encontrar que el contenido se encuentra: en texto sobre Base64 (PEM) o en binario (DER). Y es común que tengamos que hacer conversiones entre DER a PEM, o PEM a DER. Para realizar eso podemos ejecutar los siguientes comandos:

PEM to DER

DER to PEM

Cuando vamos de texto a binario (PEM a DER) es necesario indicar explícitamente que la salida de conversión es DER con el parámetro -outform. Y cuando es de binario a texto (DER to PEM) hay que indicar de forma explicita que el archivo de lectura esta sobre DER.

Estos comandos de openssl los ejecutamos para un certificado x509 pero aplica para los demás estándares: pcks12, pcks8, rsa, ETC.

Podría ser el caso en que el certificado (solo la parte publica) lo tengamos codificado en DER (binario) y la llave en otro archivo con la extensión .key codificado en PEM (texto).

Para validar que tipo de codificación tenemos podemos hacer el siguiente ejercicio sobre el archivo que tenemos:

De forma predeterminada openssl asume que es un archivo del tipo PEM, entonces si recibimos un error:

unable to load certificate

12626:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:647:Expecting: TRUSTED CERTIFICATE

Quiere decir que tenemos un archivo codificado sobre DER (binario). Entonces debemos indicar de forma explicita a openssl que el archivo se encuentra sobre DER:

Los formatos en que se pueden importar hacia Azure KeyVault son PEM y PFX (igual a pkcs12), aqui dejo unos comandos de openssl para realizar las conversiones o juntar los archivos cuando los tenemos separados:

DER file (.crt .cer .der) to PEM

PKCS#12 file (.pfx .p12)  to PEM

PEM certificate file and a private key to PKCS#12 (.pfx .p12)

CER and KEY to PKCS#12 (.pfx .p12)

Mas información:

  1. convert certificate
  2. PKCS

Importando a KeyVault

Una vez que ya existe el servicio creado desde el portal hay que obtener ciertos valores para poder conectarnos con el cliente de c#.

Los valores son:

  • URL: Este se obtiene directamente desde el dashboard del servicio en el portal.
  • ApplicationID: Este se obtiene de una app que creamos en el directorio activo de la suscripción de Azure. Aquí dejo la entrada donde se explica la autenticación por Active Directory.
  • ApplicationKeySecret: Este también lo obtenemos dentro de las key de la aplicación que creamos previamente. Aquí dejo la entrada donde se explica la autenticación por Active Directory.

Una vez que recuperamos esos valores los vamos a colocar sobre los campos de nuestra interfaz en WPF:

En los respectivos campos de captura escribimos los valores que ya recuperamos. Estos valores no pueden faltar porque es la cuenta donde se colocara el certificado.

Ahora veamos el metodo con el que se genera el cliente de Azure KeyVault y se autentica con los valores que agregamos:

Recuperamos los valores de los controles this.ClientIdText.Textthis.SecretText.Text, y creamos el objeto KeyVaultClient, que en el constructor recibe una lambda que autentica y recupera un token de acceso.

Después ya tenemos los controles para seleccionar el certificado que vamos a importar. Y un campo para escribir la contraseña que encripta la llave privada del certificado. Esta se genero al momento de exportar la llave o al momento de generar el certificado.

Al momento de dar click sobre el botón “Search…” nos permite buscar un certificado en el explorador:

Seleccionamos nuestro archivo, que en nuestro caso es un PFX. Si no hay ningún problema con la contraseña nos muestra detalle del certificado:

Aquí el código que genera la ventana de dialogo para buscar el certificado y la parte de código que obtiene la información:

Ya que tenemos el certificado seleccionado y que es válido, damos click sobre el botón “Import” para que se agregue al contenedor de Azure KeyVault:

 

Y este es la definición método que realiza la importación con el cliente de Azure KeyVault:

Aquí es donde ocupamos la url del servicio de KeyVault y el método que hace la importación es ImportCertificateAsync, y el objeto de respuesta trae toda los metadatos y el identificador con el que preguntaremos para hacer operaciones:

 

Finalmente, con el identificador podemos ya realizar operaciones de firmado y sellado con nuestro certificado.

Aquí el código completo