Ir al contenido

¡Se acercan los certificados de 47 días! ¿Estás preparado?

Actúa ahora →

Cómo integrar una canalización de CD de CI de Jenkins con firma de código

tareas relacionadas con el desarrollo de software

Jenkins es una herramienta de automatización de código abierto ampliamente utilizada para la integración y entrega continuas (CI/CD) de aplicaciones de software. Jenkins proporciona una interfaz de usuario web que facilita la configuración y la gestión de trabajos, que son tareas automatizadas que pueden programarse para ejecutarse en momentos específicos o activarse por eventos específicos. Estos trabajos pueden utilizarse para compilar código, ejecutar pruebas, implementar aplicaciones y realizar muchas otras tareas relacionadas con el desarrollo de software.

Algunas de las características clave de Jenkins incluyen:

  • Fácil instalación y configuración.

    Jenkins es fácil de instalar y configurar y se puede configurar en una amplia gama de sistemas operativos y plataformas.

  • Gestión eficaz de trabajos

    Jenkins permite crear y gestionar trabajos, que son tareas automatizadas que pueden programarse para ejecutarse en momentos específicos o activarse por eventos específicos. Los trabajos se pueden usar para compilar código, ejecutar pruebas, implementar aplicaciones y realizar muchas otras tareas relacionadas con el desarrollo de software.

  • Amplia gama de complementos e integraciones

    Jenkins cuenta con una gran cantidad de complementos e integraciones disponibles, lo que le permite funcionar con diversas herramientas y tecnologías. Esto lo hace altamente personalizable y flexible.

  • Soporte para tuberías

    Jenkins ofrece un sólido soporte para pipelines, que son conjuntos de etapas que definen un flujo de trabajo de desarrollo de software. Los pipelines se pueden definir mediante código, lo que los hace altamente personalizables y fáciles de controlar por versiones.

  • Soporte de pruebas integrado

    Jenkins ofrece compatibilidad integrada con diversos tipos de pruebas, como pruebas unitarias, de integración y funcionales. Esto facilita la ejecución de pruebas como parte de un flujo de trabajo de integración continua, garantizando que cualquier cambio en el código se pruebe exhaustivamente antes de implementarse en producción.

  • Escalabilidad organizacional

    Jenkins se puede escalar fácilmente para soportar grandes equipos de desarrollo y flujos de trabajo de desarrollo de software complejos.

  • De código abierto

    Jenkins es un software de código abierto, lo que significa que su uso es gratuito y se puede personalizar para satisfacer las necesidades específicas de su equipo de desarrollo.

Diseño de código con Jenkins

Para realizar el diseño de código utilizando Jenkins, siga los pasos a continuación.

La firma digital de código es un procedimiento que verifica la legitimidad del autor y la originalidad y autenticidad de la información digital, en particular del código de software. Asimismo, garantiza que la información no sea código malicioso. Además, asegura que esta información no haya sido alterada, falsificada ni eliminada después de haber sido firmada digitalmente.

En resumen, para integrar Jenkins con la firma de código: instale SignTool y el cliente KSP en el agente de Jenkins, otorgue a la cuenta de servicio de Jenkins solo los permisos específicos y limitados que requiere KSP (no permisos de administrador local) y, a continuación, añada una etapa en el pipeline que ejecute SignTool contra el certificado registrado en KSP. La clave privada permanece en el HSM durante todo el proceso; el pipeline nunca la gestiona directamente.

Puntos Clave

  • La cuenta de servicio de Jenkins nunca debería necesitar permisos de administrador local completos para firmar. Si se produce un error de permisos, otorgue el acceso específico que necesite KSP o signtool; no utilice permisos de administrador por defecto para solucionar el error.
  • Esta página trata específicamente sobre Jenkins como tutorial de plataforma. Para obtener información más amplia sobre la arquitectura de referencia, las puertas de aprobación y el modelo de evidencia de auditoría, consulte Buenas prácticas de firma de código en el ciclo de vida del desarrollo de software (SDLC).

Los requisitos previos para realizar esta tarea incluyen:

  1. Configuración de Jenkins en su dispositivo
  2. Signtool instalado y configurado
  3. ECSigning KSP instalado y configurado.

Para configurar Jenkins, siga este enlace.

Solución de firma de código empresarial

Obtenga una solución para todas sus necesidades criptográficas de firma de código de software con nuestra solución de firma de código.

Para instalar y configurar Signtool siga los pasos a continuación:

Signtool se puede descargar como parte del SDK de Windows. Descargue el SDK de Windows aquí: ( developer.microsoft.com/en-us/windows/downloads/windows-10-sdk/ )

Puede elegir instalar solo las herramientas de firma del SDK de Windows para aplicaciones de escritorio.

Abra el archivo winsdksetup.exe. Recuerde la ruta predeterminada que se muestra en la ruta de instalación, ya que será útil para ejecutar estos comandos desde el símbolo del sistema.

Inicio del SDK de Windows

En la página de Privacidad de Windows Kits, cualquiera de las opciones para permitir que Microsoft recopile información es válida. Haga clic en Siguiente.

Privacidad del SDK de Windows

Acepta el acuerdo de licencia

Acuerdo de licencia del SDK de Windows

Deseleccione todas las características excepto las Herramientas de firma del SDK de Windows para aplicaciones de escritorio y, a continuación, seleccione Instalar.

función del SDK de Windows

Cuando se le pregunte si desea permitir que esta aplicación realice cambios, seleccione Sí.

Control de cuentas de usuario de Windows
SDK de Windows final

Haga clic en la barra de búsqueda de Windows en la barra de tareas y escriba “Editar las variables de entorno del sistema” y seleccione la opción del panel de control del mismo nombre.

editar la variable de entorno del sistema

Haga clic en variables de entorno.

variables ambientales modales

Antes de editar la lista de variables, navegue hasta la ubicación donde está instalado el SDK de Windows usando el explorador de archivos. Debe copiar la ruta de la carpeta que contiene la aplicación signtool. La ruta predeterminada es C:\Archivos de programa (x86)\Windows Kits\10\bin\10.0.22621.0\x64 ( consulte la captura de pantalla a continuación). Asegúrese de hacer clic con el botón derecho y copiar la ruta como se muestra. También puede ver la aplicación signtool al final de la lista de archivos; este es el comando que ejecutará.

Ruta de instalación de signtool

En la lista Variables del sistema, haga clic en Nuevo. A continuación, escriba Ruta como nombre de la variable y copie y pegue la ruta. Finalmente, haga clic en Aceptar en la ventana Variables de entorno y en la ventana Propiedades del sistema.

añadir nueva variable del sistema

Para probar la instalación, abra el símbolo del sistema y escriba signtool; el resultado debería ser como se muestra a continuación.

Símbolo del sistema de signtool

La ubicación de instalación predeterminada de signtool es, por ejemplo: C:\Archivos de programa (x86)\Windows Kits\10\bin\10.0.22621.0\x64

Para configurar KSP siga los pasos a continuación:

Encryption Consulting le ofrece la solución CodeSignSecure . Esta solución le permite almacenar las claves de forma segura e inviolable, además de brindarle visibilidad y control total de las actividades de firma de código. Las claves privadas del certificado de firma de código se pueden almacenar en un HSM para eliminar los riesgos asociados con claves robadas, dañadas o utilizadas indebidamente.

Si está utilizando nuestra solución, puede descargar el KSP siguiendo los pasos a continuación:

  • Registrarse en Código de firma seguro.
  • Navegar a: Repositorio de herramientas de firma.

    Página de herramientas de firma segura de Codesign
  • Descargar “Consultoría de cifrado CNG-SigningKSP”
  • Instale las herramientas de cliente con el instalador .MSI. Este automatiza gran parte de la configuración. Vaya a la ubicación donde se guardó el archivo descargado e inicie el instalador.

    instalador msi
  • Haga clic en Siguiente cuando aparezca el asistente de instalación.

    Configuración de KSP para firma EC en casa
  • Haga clic en Siguiente.

    Instalación de la carpeta de configuración de KSP con firma EC
  • En la sección Nombre de usuario campo, tipo admin.
  • En el campo Código , copie el código del repositorio de la API de Postman . Haga clic en la API GetLoginToken y copie el código del cuerpo.

    Descarga PostMan desde este enlace . Una vez descargado, haz clic en el botón "Saltar" en la parte inferior de la ventana. En el panel de control, agrega una nueva colección usando el botón con el signo más junto a "Colecciones".

    API GetLoginToken (http://codesignsecureapi.encryptionconsulting.com/api/auth/GetLoginToken): Esta es la API más importante, ya que proporciona un token de portador para usar con el resto de las API. El contenido del cuerpo se muestra a continuación. El código funciona como contraseña para obtener el token de portador, el campo de usuario es el nombre de usuario y el campo de tipo de identidad especifica el tipo de usuario. Haga clic en Enviar para generar una salida que muestra el token de portador en la parte inferior. Copie este token para usarlo.

    API de token de portador de cartero
  • Cambie la Identidad Tipo a 1.
  • Abandonar URL base de la API lo mismo.
  • Haga clic en Siguiente.

    Información de autenticación de usuario de configuración de KSP de firma EC
  • Haga clic en Siguiente.

    Confirmación de la instalación y configuración de KSP con firma EC
  • Luego se le notificará que este programa realizará cambios en su PC, haga clic en Sí.

    Control de cuentas de usuario de configuración de MSI
  • La instalación ya está completa.

    Instalación y configuración de KSP con firma EC completa

Una vez configurado Jenkins, la cuenta de servicio que lo ejecuta necesita permiso para invocar signtool y acceder al KSP. Esto no requiere privilegios de administrador local completos, y ejecutar Jenkins como administrador para solucionar un problema de permisos de firma constituye una violación del principio de mínimo privilegio que conviene evitar. El requisito real es más específico: la cuenta de servicio de Jenkins necesita acceso de lectura a la ruta del archivo de certificado referenciada en la canalización y cualquier permiso específico que el cliente KSP requiera para autenticarse en el servicio de firma (normalmente una identidad de cliente registrada, no un administrador local). Otorgue ese acceso específico mediante una cuenta de servicio dedicada con privilegios limitados, en lugar de usar la cuenta de administrador por defecto. Consulte la documentación de su KSP para conocer el permiso exacto que necesita, en lugar de otorgar derechos amplios para solucionar un error poco claro.

  • Acceda a los servicios de su sistema (puede buscarlos) para comprobar con qué cuenta se ejecuta Jenkins actualmente, lo cual se muestra en la columna "Iniciar sesión como".
  • Si Jenkins no puede acceder a signtool o al KSP debido a un error de permisos, la solución consiste en otorgar a esa cuenta de servicio específica el permiso limitado que le falta (acceso al archivo de la ruta del certificado o registro del cliente KSP), no en cambiar la cuenta a Administrador. Haga doble clic en Jenkins en Servicios, o haga clic con el botón derecho y seleccione Propiedades, luego Iniciar sesión, para ver y ajustar los permisos de la cuenta.

Una vez configurado esto, nos dirigiremos a Jenkins. Acceda a la URL o nombre de host que especificó anteriormente durante la configuración desde su navegador para llegar a Jenkins. En mi sistema, lo configuré como http://localhost:8080/ (que también es la configuración predeterminada).

En su Panel de Control siga los pasos a continuación:

  • Desde el Panel de Control, haga clic en Nuevo Elemento.

    panel de control de Jenkins
  • Ingrese cualquier nombre de elemento y haga clic en tubería y haga clic en Aceptar.

    Jenkins ingresa el nombre del artículo
  • En la página de configuración, en General, coloque una descripción como desee.

    configuración general de jenkins
  • Desplácese hasta la parte inferior para encontrar Pipeline.

    Jenkins configura la canalización
  • Escriba el script en el cuadro de script y haga clic en "Guardar". Deberá editar la variable de entorno según su configuración.

    canalización { agente cualquier entorno { SM_KEY_NAME='evcodesigning' SM_CLIENT_CERT_FILE='C:\\Usuarios\\Administrador\\Escritorio\\ParaPruebas\\evcodesigning.pem' SM_HASHING_ALGORITHM='SHA256' SM_TIME_STAMP_SERVER="http://timestamp.digicert.com" SM_FILEPATH="C:\\Usuarios\\Administrador\\Escritorio\\ParaPruebas\\AgentService.exe" } etapas { stage('Firma de código') { pasos { dir('C:\\Usuarios\\Administrador\\Escritorio\\ParaPruebas'){ bat 'signtool sign /csp "Proveedor de almacenamiento de claves de consultoría de cifrado" /kc %SM_KEY_NAME% /fd %SM_HASHING_ALGORITHM% /f %SM_CLIENT_CERT_FILE% /tr %SM_TIME_STAMP_SERVER% /td SHA256 %SM_FILEPATH%' } } } } }
    
  • Haga clic en compilar ahora y verá un número de compilación ejecutándose en la pantalla.

    compilación de jenkins
  • Si hace clic en el número de compilación y va a la salida de la consola, verá que su archivo ha sido firmado.

    Jenkins firmó el archivo correctamente

Verificación y manejo de fallas

No considere “la etapa de la canalización completada” como prueba de que la firma es válida. Agregue una etapa de verificación inmediatamente después de la firma que se ejecute signtool verify /pa Se realiza una comprobación del archivo firmado y, si esta no es exitosa, se detiene la compilación. Esto permite detectar un error de firma silencioso antes de que el artefacto avance en el proceso. Si el proceso informa un error de firma, consulte la tabla a continuación antes de asumir que el certificado no es válido.

ErrorCausa probableSolución
No se encontraron certificados que cumplieran con todos los criterios establecidos.El nombre del contenedor KSP (SM_KEY_NAME) no coincide con una clave registrada o el cliente KSP no está autenticado.Confirme el nombre exacto del contenedor y vuelva a comprobar el estado de autenticación del KSP independientemente de la canalización.
Acceso denegadoLa cuenta de servicio de Jenkins carece del permiso específico que necesita KSP (esto no es motivo para otorgarle el permiso de Administrador).Conceda el permiso limitado que especifica la documentación de KSP para la autenticación del cliente.
No se pudo acceder al servidor de marca de tiempo especificado o este devolvió una respuesta no válida.El bloqueo de la URL de TSA por parte de la red o el cortafuegos, o una interrupción transitoria del servicio de TSA.Confirme el acceso saliente a la URL de la marca de tiempo; vuelva a intentarlo, ya que las interrupciones de TSA suelen ser transitorias.

En caso de reversión, si posteriormente se descubre que una compilación se firmó incorrectamente (certificado erróneo, archivo erróneo), no intente "corregir" la firma en el lugar; descarte el artefacto y vuelva a ejecutar la canalización desde la etapa de firma con una configuración corregida, de modo que haya un registro de auditoría limpio que demuestre que el artefacto defectuoso original nunca se publicó en lugar de haber sido alterado silenciosamente.

Preguntas frecuentes

¿La cuenta de servicio de Jenkins necesita derechos de administrador para ejecutar signtool?

No. Necesita el permiso específico que requiere KSP para autenticarse y acceder al archivo de la ruta del certificado a la que se hace referencia en la canalización, no derechos de administrador local completos. Considerar un error de permisos como motivo para otorgar privilegios de administrador es una violación común, pero evitable, del principio de mínimo privilegio.

¿Cómo puedo saber si el proceso generó una firma válida, y no solo que la etapa no presentó errores?

Agregue una etapa de verificación que se ejecute signtool verify /pa contra el archivo firmado y hace que la compilación falle si no es exitosa, en lugar de asumir que una etapa de firma completada significa una firma válida.

¿La clave privada pasa alguna vez por el agente de Jenkins?

No, en una configuración correcta. El agente envía una solicitud de firma a través del KSP al servicio de firma respaldado por el HSM; la operación de clave privada se realiza dentro del HSM.