TCS

crtFC_Sectigo.sh

Herramienta para la obtención de certificados para firma de código sin necesidad de utilizar un navegador

Por Miguel Macías Enguídanos - UPV

Introducción

Para la obtención de certificados para firma de código con Sectigo, hay que tener en cuenta:

  • desde el SCM no se pueden obtener (directamente) certificados de tipo CS (Code Signing)
    • esto es distinto a los certificados de tipo SSL (los de servidor), por ejemplo, que pueden ser obtenidos directamente por un RAO/DRAO

  • pero desde el SCM se puede invitar a un usuario, para que obtenga un certificado CS (una invitación = un certificado CS)

    • la opción se encuentra en: CertificatesCode Signing CertificatesAdd
    • los datos de este usuario se introducen en los campos (obligatorios) Email Address y Full Name (que no aparecerán en el certificado final)
    • si queremos que aparezca un email en el certificado CS (en el campo SAN: Subject Alternative Name) hay que utilizar el campo Contact email
    • se puede invitar repetidamente al mismo usuario (es decir, reutilizar los mismos campos de nombre y email)
    • al usuario le llegará un email con una URL para iniciar el proceso:

    • En dicha URL podrá (luego veremos esto con detalle) generar las claves y solicitar el certificado.
    • Si todo es correcto, el usuario recibirá un nuevo email, con la URL de descarga

    • Una vez descargado, se podrá completar la instalación del certificado en el equipo.

Es decir, el proceso ideado por Sectigo es:

  1. un RAO/DRAO invita a un usuario (que puede ser el mismo RAO/DRAO) para que pueda solicitar un certificado CS
  2. el usuario recibe un email para que inicie el proceso (con un navegador) y solicite el certificado
  3. el usuario recibe un email cuando el certificado está emitido y puede descargarlo

Para emitir un certificado, la CA necesita:

  • la clave pública
  • una prueba de que el solicitante tiene la clave privada correspondiente
  • los datos identificativos que aparecerán en el certificado.

Para los certificados CS, los datos identificativos se obtienen automáticamente (son los datos de la Organización que constan en el SCM). Además, se puede añadir un Contact email al iniciar el proceso (es opcional).

Como en todo tipo de certificados, existen certificados CS con validación extendida (EV), lo que aporta mayores garantías para decidir la confianza en los mismos. Los navegadores y sistemas operativos aceptan (sin intervención del usuario) los certificados CS con EV (siempre que se cumplan todos los demás requisitos, claro). En Sectigo se pueden pedir siguiendo otro proceso y pagando los costes asociados (son certificados con doble factor, donde la clave privada está en un token criptográfico).

El proceso que estamos describiendo genera certificados CS de tipo OV, donde los datos de identificación son el único mecanismo para decidir si confiamos o no en el código así firmado (no hay un dominio DNS, como en los certificados de tipo SSL, para cotejar). En ocasiones será el usuario el que tendrá que validar la firma a partir del CN que aparezca en el certificado.

Para la generación de claves asimétricas y petición del certificado estamos acostumbrados a utilizar OpenSSL (u otras herramientas: CertUtil, Keytool, etc.) y pasar un CSR (Certificate Signing Request) a la CA. El CSR contendrá la clave pública, la prueba que confirma que tenemos la clave privada y datos identificativos (que, normalmente, serán tenidos en cuenta parcialmente).

En el proceso ofrecido por Sectigo existen dos opciones:

  • subir un CSR para solicitar el certificado (tanto el CSR como las claves asimétricas se habrán generado con una herramienta externa)

  • generar las claves con código JavaScript (desarrollado por Sectigo) con el propio navegador (el CSR se pasará automáticamente en el proceso)

Por seguridad, se recomienda no utilizar la segunda opción (donde el código JavaScript es el que genera y gestiona nuestra clave privada).

Podemos automatizar el proceso (generar claves, preparar el CSR, obtener el PKCS12, etc.) y evitar el uso de un navegador a través de un script. Este script utiliza cURL como cliente HTTP y OpenSSL para la gestión de las claves, solicitud de certificado, generación del PKCS12…

Script crtFC_Sectigo.sh para la solicitud de certificados CS

Se presenta el script crtFC_Sectigo.sh para la solicitud de certificados CS (Code Signing) que evita el uso de navegadores obsoletos

El proceso es:

  1. desde el SCM, un RAO/DRAO invita a un usuario (que puede ser el mismo RAO/DRAO) para que pueda solicitar un certificado CS
  2. el usuario recibe un email para que inicie el proceso a partir de una URL y solicite el certificado
  3. el usuario recibe un email cuando el certificado está emitido y puede descargarlo desde una URL

Los datos del usuario (invitado a generar el certificado CS) no aparecerán en el certificado. Solo aparecerán los datos de la Organización (tal como constan en el SCM) y (opcionalmente) un email de contacto.

La idea es que las URL recibidas en los correos no se introducen en un navegador, sino en el script. Como los correos pueden tardar en llegar (normalmente todo el proceso es rápido y se completa en un par de minutos), el script está preparado para cortarse a mitad y reanudar en el punto en el que se quedó.

Ejemplo de uso

Un ejemplo de uso sería:

Un RAO/DRAO entra en el SCM y añade una nueva invitación para generar un certificado CS

 

 

 

El usuario invitado recibe un correo para que inicie el proceso de solicitud. Contiene una URL

 

 

 

El usuario ejecuta el script e introduce la URL completa de invitación (la recibida en el primer correo)

 

El usuario recibe un segundo correo indicando que ya puede recoger el certificado. Contiene una URL

 

 

 

El usuario (ejecuta el script si no está en marcha) introduce la URL completa de descarga (la recibida en el segundo correo)

 

 

El usuario introduce la contraseña con la que se protegerá el PKCS12 generado por el script

Y la interacción con el script sería algo de este estilo:

user@WSL:~/certs/fc/2021$ ./crtFC_Sectigo.sh -f certPrueba_2021
 
Generando certificado con ficheros certPrueba_2021.*
 
Guardando ficheros temporales en /home/user/certs/fc/2021/tmp
(no eliminar hasta no tener el certificado completo)
 
 
¿Ya has recibido el correo inicial?
    puedes cortar (Ctrl+C) este proceso y continuar en otro momento
URL con la invitación: https://cert-manager.com/customer/RedIRIS/cs?action=invite&requestCode=hF5...ots&email=certificados%40upv%2ees
 
¿Tienes el correo indicando que se ha emitido el certificado?
    puedes cortar (Ctrl+C) este proceso y continuar en otro momento
URL para la instalación: ^C
user@WSL:~/certs/fc/2021$ ./crtFC_Sectigo.sh -f certPrueba_2021
 
Generando certificado con ficheros certPrueba_2021.*
 
Guardando ficheros temporales en /home/user/certs/fc/2021/tmp
(no eliminar hasta no tener el certificado completo)
 
Clave generada previamente
 
¿Tienes el correo indicando que se ha emitido el certificado?
    puedes cortar (Ctrl+C) este proceso y continuar en otro momento
URL para la instalación: https://cert-manager.com/customer/RedIRIS/cs?action=installcert&id=8396
 
Generando un PKCS12 con clave privada y certificados (incluyendo la cadena completa)
 
Enter Export Password: ********
Verifying - Enter Export Password: ********
user@WSL:~/certs/fc/2021$ ll
total 24
drwxr-xr-x 1 user user  512 Jan 17 14:11 ./
drwxr-xr-x 1 user user  512 Jan 17 13:58 ../
-rw-r--r-- 1 user user  294 Jan 17 14:01 certPrueba_2021.conf
-rw-r--r-- 1 user user  964 Jan 17 14:01 certPrueba_2021.csr
-r-------- 1 user user 1679 Jan 17 14:01 certPrueba_2021.key
-rw------- 1 user user 7613 Jan 17 14:11 certPrueba_2021.p12
-rw-r--r-- 1 user user 5923 Jan 17 14:11 certPrueba_2021.pk7

El resultado final es un PKCS12 (que está protegido con contraseña, contiene la clave privada, el certificado final y la cadena de certificados hasta la raíz). Pero también quedan disponibles otros ficheros, siendo destacables:

  • .key: contiene la clave privada en claro (lo mejor es eliminarlo, si no se necesita)
  • .pk7: contiene todos los certificados, en formato binario PKCS7

Durante el proceso, el RAO/DRAO puede ver en el SCM el estado de la solicitud, que va pasando por invitedrequestedappliedissueddownloaded. Se puede reenviar el correo con la invitación (si no llega inicialmente) o descargar el certificado (una vez emitido).

Espero que os sea útil.

Descarga

Se ha comprobado que el script crtFC_Sectigo.sh (versión 2.5 - 20210607) funciona correctamente en:

S.O. Versión S.O. OpenSSL cURL
macOS Catalina 10.15.7 LibreSSL 2.8.3 curl 7.64.1
macOS Big Sur 11.1 LibreSSL 2.8.3 curl 7.64.1
Ubuntu LTS 20.04.1 OpenSSL 1.1.1f curl 7.68.0

Si alguien lo utiliza en otro entorno y desea enviarnos la información, la incorporaremos en esta tabla.

Ejecución

Podemos ejecutar el script con la opción -h para obtener la ayuda:

> ./crtFC_Sectigo.sh -h
crtFC_Sectigo 2.5

./crtFC_Sectigo.sh [-h] [-f nombreFicheros] [-c bitsClave]
  -h: muestra la ayuda
  -f: nombre común para todos los ficheros generados (con distintas exte
  -c: tamaño en bits de las claves generadas (predeterminado: 3072)