Firmas de ejecutables
Es conveniente firmar los ejecutables para evitar avisos alarmantes a la hora de bajar los mismos o ser ejecutados.
Para ello se utilizan certificados para firma de código.
Una autoridad certificadora certifica que eres quién dice ser y te suministra un certificado para realizar la firma de los ejecutables.
Obtención de certificado para firma de código
Buscar una autoridad certificadora o intermediario
No vale cualquier certificado digital para firma el código fuente. Tiene que ser una entidad de certificación de confianza.
Como lo que queremos es que sirva para Windows, tenemos que buscar alguna que lo sea en dicho sistema operativo.
Dicha autoridad debe tener habilitado como propósito la firma de código. Por eso no nos valen autoridades certificadoras como la FNMT (por desgracia). Hay que descartar los certificados de la FNMT que se añaden con el configurador de la AEAT y no tiene la posibilidad de firmar código.
Generalmente se usan: Digicert, Thawte, Comodo, Go Daddy, Symantec, GlobalSign, ...
No todos tienen la misma reputación y por lo tanto no valen igual.
El certificado puede obtenerse directamente de la autoridad o de un intermediario, generalmente más barato.
Elegir tipo de verificación
Dependiendo del caso habrá que elegir entre diferentes opciones según a quién verifica la autoridad certificadora. Es asegurarse de que el solicitante del certificado es quien dice ser.
Se Verifica | Descripción |
---|---|
Persona física | Firma de ejecutables como persona física |
Organización | Firma de ejecutables como persona jurídica: empresa, organización, etc |
Organización Extendida | La verificación es más exhaustiva y el certificado habilita para firmar drivers y programas con más privilegios en el sistema operativo. |
Cualquiera de las dos primeras es suficiente para distribuir los ejecutables a los clientes.
Obtener el certificado de firma de código
Para esto se utilizan el famoso OpenSSL. Para Windows pueden descargarse desde https://indy.fulgan.com/SSL.
Información sobre los comandos habituales de OpenSSL.
Crear clave privada - SSL Key File
Creamos una clave privada con seguridad ampliada
openssl genrsa -out criterium.key 4096
Cuidado con esta clave, es fundamental tenerla guardada, ya que permite importar el certificado final.
Crear una petición certificado - Certificate Signing Request (CSR)
openssl req -out criterium.csr -key criterium.key -new -sha256
Con nuestra clave privada creamos un petición de firma a la autoridad certificadora, de forma directa o a través de un intermediario.
Esta petición pide una serie de datos que tenemos que rellenar para identificarnos adecuadamente como persona física o empresa. Es importante ya que posteriormente serán los datos que verificará la autoridad certificadora.
Esto crea un archivo de texto que enviaremos a través de formulario web u otro medio a la empresa que gestiona nuestra verificación de identidad.
Verificación de identidad
Dependiendo del procedimiento de la autoridad habrá que verificar nuestra identidad. Mediante llamadas telefónicas o envío de documentación fiscal.
Descargar certificado final
Una vez verificada la identidad podremos descargar el certificado que nos permita firmar nuestros ejecutables.
1. Archivos CRT
Nuevo método de Sectigo en 09-2022
En el administrador de certificados se puede bajar un link con los cuatro certificados en formato crten un archivo zip. Habría que ponerlos todos juntos y convertirlos según el método "1. Para archivos crt"
Anterior método de descarga de archivos crt
En mi caso, https://www.ssl247.es, se descargan tres certificados: el principal (el nuestro), intermediario y raíz. Vamos a necesitar los tres, junto con la petición CSR y la clave privada.
En otra autoridad certificadora diferente, StartCom (que ya no se considera fiable) creo recordar que fue distinto, pero básicamente hay que buscar algo parecido que nos permita obtener los archivos crt.
2. Archivo CollectCCC.spc
Sectigo remite un link que nos permite bajar, en el navegador usando para hacer la petición un archivo CollectCCC.spc. Para convertir usamos el método "2. Con archivo CollectCCC.spc"
Convertir certificado
1. Para archivos crt
Ahora tenemos que exportar el certificado para que pueda importarse en navegadores o usarse para firma de ejecutables.
openssl pkcs12 -inkey criterium.key -in criterium.crt -export -out criterium.pfx
Si los certifiados están en archivos diferentes se debe incluir toda la ruta de certificación: root, intermediate y certificado simplemente concatenando todos los archivos en un único archivo.
cat root.crt >> todo.crt ; cat intermediate.crt >> todo.crt ; cat criterium.crt >> todo.crt
Ahora cuando convierta. Irán incluidos todos los certificados:
openssl pkcs12 -inkey criterium.key -in todo.crt -export -out criterium.pfx
Se le pedirá una contraseña para proteger el certificado. No corra riesgos y asigne una adecuada.
2. Con archivo CollectCCC.spc
CollectCCC es un archivo de formato .p7s. Hay que convertirlo previamente:
openssl pkcs7 -inform der -in CollectCCC.spc -print_certs -out CollectCCC.pem
Ahora ya podemos pasarlo en formato pfx/p12 con ayuda de la key creada previamente y CollectCCC:
openssl pkcs12 -export -out criterium.pfx -inkey criterium.key -in CollectCCC.pem
Se solicita una contraseña para el nuevo archivo pfx.
En mi caso uso Linux, algo pasa con este método que luego no me reconoce la clave en Windows, he importado el certificado en Firefox y luego lo he exportado en p12. Con este archivo si parece funcionar la importación y firmado de código en Windows. Misterios o falta de conocimientos :(
XCA - Interfaz gráfica para gestión de certificados
Si no se defiende con la línea de comandos puede utilizar XCA. Le permite realizar las mismas opciones que openssl por comandos. Funciona tanto en Windows como Linux.
Firma de Ejecutables
Una vez tenemos un certificado válido toca firmar los ejecutables que vamos a distribuir. Para ello usaremos SignTool de Microsoft SDKs.
Instalar SingTool
SDK 7.1
Descargamos la versión 7.1 para Windows 7. No hay que instalar todas las opciones, con instalar lo necesario para usar SignTool es suficiente. Está en la opción Tools.
SDK 8.1
Si va a firmar con SHA1 y SHA256 tendrá que utilizar esta versión.
Descargar Windows Software Development Kit (SDK) for Windows 8.1. En este caso la instalación no permite seleccionar solo las utilidades.
Firma de ejecutables
Una vez instalada la parte que queremos de Microsoft SDK podemos crear un archivo *.bat para firmar ejecutables.
Se SingTool. Con este programa no solo firmaremos, también aplicaremos una marca de tiempo al ejecutable. Mas información sobre parámetros de SignTool. Ejemplos de firmado de Thawte.
Con firma de tiempo sha1:
"C:\Archivos de programa\Microsoft SDKs\Windows\v7.1\Bin\signtool.exe" sign /f "I:\Certificados\criterium.p12" /p SuPassword /t http://timestamp.verisign.com/scripts/timstamp.dll /d "Nombre de su empresa" /du "http://sudominio.es" Programa*.exe
Con firma de tiempo sha256:
"C:\Archivos de programa\Microsoft SDKs\Windows\v7.1\Bin\signtool.exe" sign /f "I:\Certificados\criterium.p12" /p SuPassword /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp /d "Nombre de su empresa" /du "http://sudominio.es" Programa*.exe
Doble firma, con sha1 y sha256. Esta opción es la más segura y compatible, aunque el ejecutable final es algo mayor. Se requiere el SDK 8.1.:
"C:\Archivos de programa\Windows Kits\8.1\bin\x86\signtool.exe" sign /f "I:\Certificados\criterium.p12" /p SuPassword /fd sha1 /t http://timestamp.verisign.com/scripts/timstamp.dll /d "Nombre de su empresa" /du "http://sudominio.es" /v Programa*.exe
"C:\Archivos de programa\Windows Kits\8.1\bin\x86\signtool.exe" sign /f "I:\Certificados\criterium.p12" /p SuPassword /fd sha256 /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp /td sha256 /as /d "Nombre de su empresa" /du "http://sudominio.es" /v Programa*.exe
Esto sería todo, ahora su programa aparecerá adecuadamente firmado. En el propio ejecutable aparecerá la ruta completa de certificación. Un ejemplo de dos empresas certificadoras diferentes:
Esto es lo que sale al ejecutar el programa:
Ahora me queda la duda de hasta que punto todo este tema no es algo así como un chantaje :(