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: Certificates ⇒ Code Signing Certificates ⇒ Add
- 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:
- un RAO/DRAO invita a un usuario (que puede ser el mismo RAO/DRAO) para que pueda solicitar un certificado CS
- el usuario recibe un email para que inicie el proceso (con un navegador) y solicite el certificado
- 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:
- desde el SCM, un RAO/DRAO invita a un usuario (que puede ser el mismo RAO/DRAO) para que pueda solicitar un certificado CS
- el usuario recibe un email para que inicie el proceso a partir de una URL y solicite el certificado
- 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 invited → requested → applied → issued → downloaded. 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 -hcrtFC_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)