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:
- Configuración de Jenkins en su dispositivo
- Signtool instalado y configurado
- ECSigning KSP instalado y configurado.
Para configurar Jenkins, siga este enlace.
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.

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.

Acepta el acuerdo de licencia

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

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


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.

Haga clic en variables de entorno.

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á.

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.

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.

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.

- 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.

-
Haga clic en Siguiente cuando aparezca el asistente de instalación.

-
Haga clic en Siguiente.

- 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.

- Cambie la Identidad Tipo a 1.
- Abandonar URL base de la API lo mismo.
-
Haga clic en Siguiente.

-
Haga clic en Siguiente.

-
Luego se le notificará que este programa realizará cambios en su PC, haga clic en Sí.

-
La instalación ya está 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.

-
Ingrese cualquier nombre de elemento y haga clic en tubería y haga clic en Aceptar.

-
En la página de configuración, en General, coloque una descripción como desee.

-
Desplácese hasta la parte inferior para encontrar Pipeline.

-
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.

-
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.

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.
| Error | Causa probable | Solució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 denegado | La 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.
