Obtención de certificados para firma de ejecutables

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.

Autoridades certificadoras de confianza en Windows 7 SP1

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.

Emisores de certificados para firma de código

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.

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.

Descarga de certificados

En otra autoridad certificadora diferente, StartCom (que ya no se considera fiable) creo recordar que fue diferente.

Convertir certificado

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

Puede incluir toda la ruta de certificación: root, intermediate y certificado simplemente concatenando todos los archivos en un único archivo.

cat root.crt >> todo.crl ; cat intermediate.crt >> todo.crl ; 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.p12

Se le pedirá una contraseña para proteger el certificado. No corra riesgos y asigne una adecuada.

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.

XCA - programa para gestión de certificados

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.

Instalar SingTool desde SDK 7.1

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.

Instalar SingTool desde SDK 8.1

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:

Ejecutables firmados

Esto es lo que sale al ejecutar el programa:

Ejecución de programas firmados

Ahora me queda la duda de hasta que punto todo este tema no es algo así como un chantaje :(