Desde el 1 de febrero de 2017, la firma de código EV se puede considerar como el requisito mínimo para la firma de código. Los certificados se instalan en tokens USB y requieren controladores para funcionar. Con la herramienta “Signtool.exe” del SDK de Microsoft Windows, normalmente no hay problema para firmar binarios de forma interactiva. La intervención manual ocurre cuando Signtool intenta acceder al certificado en el token USB y el controlador de seguridad genera un cuadro de diálogo emergente para ingresar la contraseña del token.

En un entorno de compilación de integración continua/entrega continua (CI/CD), la mayoría de las tareas para crear un software son automatizados y ejecutados por agentes de compilación desatendidos. Eso significa que no hay nadie conectado de forma interactiva en el agente. Dichos agentes suelen ser máquinas virtuales sin monitor físico ni teclado. Si se necesita la firma de código EV, el proceso de compilación se interrumpirá o se detendrá porque ningún usuario verá el cuadro de diálogo emergente.

La pregunta "Automatice la firma de código de validación extendida (EV)” en stackoverflow.com ofrece muchas soluciones que veremos ahora:

1) Use la opción del controlador "Habilitar inicio de sesión único".
Esta es la respuesta favorita de las autoridades de certificación. Esto aún requiere que un usuario inicie sesión en el agente de compilación, ingrese la contraseña una vez y luego bloquee la sesión del usuario. Si el usuario cierra la sesión después de ingresar la contraseña una vez, la sesión del usuario se cierra y el controlador elimina la contraseña. Eso significa que después de cada reinicio del sistema operativo, alguien debe iniciar sesión en el agente antes de que los procesos de compilación se puedan ejecutar con éxito. Esta es una fuente potencial de errores molestos.

2) Use una herramienta/secuencia de comandos que detecte el cuadro de diálogo emergente e ingrese la contraseña automáticamente.
Esto también requiere que un usuario haya iniciado sesión en el agente de compilación. De lo contrario, no hay contexto de GUI para mostrar el cuadro de diálogo y la herramienta no puede detectarlo. Esto también significa que se necesita una preparación manual después de reiniciar el agente de compilación.


3) Reemplace "Signtool.exe" con un programa que pueda firmar un archivo y desbloquear el token USB sin intervención manual.
La respuesta de “drakeb” en stackoverflow.com ofrece el código fuente para construir “etokensign.exe” que toma información similar como “Signtool.exe” y la contraseña para desbloquear el token. También necesita el nombre del contenedor del certificado. Que es una cadena hexadecimal que debe extraerse manualmente del token USB.

La última propuesta es la única que no necesita inicio de sesión de usuario en el agente de compilación. Esta solución funciona totalmente desatendida. Pero aún así, la necesidad del nombre del contenedor vincula la canalización de compilación al token USB. Por supuesto, puede usar un archivo de script simple en el agente de compilación para romper esta dependencia. Entonces necesita un script individual para cada token. Todos los scripts deben tener el mismo nombre porque la canalización de compilación no debería necesitar diferenciar en qué agente de compilación se ejecuta. Esto hace que las soluciones sean un poco impracticables, o mejor, más complejas de lo esperado.


Esa fue la razón por la que decidí modificar un poco el código fuente. El reto era identificar el certificado por su nombre como se hace para “Signtool.exe” con el parámetro “/n”.

Haga clic en el siguiente enlace para obtener el código fuente de "eTokenSign2", que contiene algunos pequeños cambios en el código fuente de "draketb":

La sintaxis de la línea de comandos de eTokenSign2.exe es
etokensign.exe

Puede utilizar el código fuente tal como está. Para crear su propio binario simplemente siga los pasos de construcción al final de la blog entrada.

En nuestro entorno de producción, el binario se envuelve con un archivo de script. Entonces, solo nuestros administradores de TI conocen las contraseñas de los tokens.
La firma exitosa se puede verificar en las propiedades de los archivos firmados.

Espero que este ejecutable lo ayude a ejecutar sus procesos de compilación sin necesidad de intervención manual 🙂

Para construir el binario, siga estos pasos:

1- Descarga el siguiente archivo zip y descomprímelo.
2- Instalar Visual Studio Community 2017 o el Herramientas de compilación de Visual Studio 2017
3- Abra un "Símbolo del sistema del desarrollador"
4- Ejecute “msbuild.exe eTokenSign2.vcxproj /p:Configuration=”Release” /p:Plataforma=x86″

Observación
EL REINO UNIDO SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO, ENTRE OTRAS, LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN FIN DETERMINADO Y NO VIOLACIÓN. EN NADA EVENT ¿LOS AUTORES O LOS TITULARES DE LOS DERECHOS DE AUTOR SERÁN RESPONSABLES DE CUALQUIER RECLAMACIÓN, DAÑOS U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN DE CONTRATO, AGRAVIO O DE CUALQUIER OTRO TIPO, QUE SURJA DE O ESTÉ RELACIONADO CON EL SOFTWARE O EL USO U OTROS TRATOS EN EL SOFTWARE.

Copyright (c) 2018 panagenda

Excepto donde se indique lo contrario, este trabajo está bajo licencia https://creativecommons.org/licenses/by-sa/4.0/.
Es un trabajo derivado basado en el código de "draketb" en https://stackoverflow.com/a/47894907.