Cómo firmar un paquete de la aplicación con SignTool

Nota

Para firmar un paquete de aplicación de Windows, consulta Firmar un paquete de aplicación con SignTool.

Obtenga información sobre cómo usar SignTool para firmar los paquetes de aplicaciones de Windows para que se puedan implementar. SignTool forma parte del Kit de desarrollo de software (SDK) de Windows.

Todos los paquetes de aplicaciones de Windows deben firmarse digitalmente para poder implementarlos. Aunque Microsoft Visual Studio 2012 y versiones posteriores pueden firmar un paquete de aplicación durante su creación, los paquetes que cree mediante la herramienta del empaquetador de aplicaciones (MakeAppx.exe) de Windows SDK no están firmados.

Nota

Solo puedes usar SignTool para firmar los paquetes de aplicaciones de Windows en Windows 8 y versiones posteriores o Windows Server 2012 y versiones posteriores. No puedes usar SignTool para firmar paquetes de aplicaciones en sistemas operativos de nivel descendente, como Windows 7 o Windows Server 2008 R2.

Lo que necesita saber

Tecnologías

Requisitos previos

Consideraciones adicionales

El certificado que use para firmar el paquete de la aplicación debe cumplir estos criterios:

  • El nombre del firmante del certificado debe coincidir con el atributo Publisher contenido en el elemento Identity del archivo AppxManifest.xml que se almacena en el paquete. El nombre del publicador forma parte de la identidad de una aplicación de Windows empaquetada, por lo que debe hacer que el nombre del firmante del certificado coincida con el nombre del publicador de la aplicación. Esto permite comprobar la identidad de los paquetes firmados con la firma digital. Para obtener información sobre los errores de firma que pueden surgir al firmar un paquete de aplicación mediante SignTool, consulta la sección Comentarios de Cómo crear un certificado de firma de paquete de aplicación.

  • El certificado debe ser válido para la firma de código. Esto significa que ambos elementos deben ser true:

    • El campo Uso extendido de clave (EKU) del certificado debe estar sin establecer o contener el valor de EKU para la firma de código (1.3.6.1.5.5.7.3.3).
    • El campo Uso de claves (KU) del certificado debe estar sin establecer o contener el bit de uso de la firma digital (0x80).
  • El certificado contiene una clave privada.

  • El certificado es válido. Está activo, no ha expirado y no se ha revocado.

Instrucciones

Paso 1: Determinar el algoritmo hash que se va a usar

Al firmar el paquete de la aplicación, debe usar el mismo algoritmo hash que usó al crear el paquete de la aplicación. Si usó la configuración predeterminada para crear el paquete de la aplicación, el algoritmo hash usado es SHA256.

Si usó el empaquetador de aplicaciones con un algoritmo hash específico para crear el paquete de la aplicación, use el mismo algoritmo para firmar el paquete. Para determinar el algoritmo hash que se va a usar para firmar un paquete, puede extraer el contenido del paquete e inspeccionar el archivo AppxBlockMap.xml. El atributo HashMethod del elemento BlockMap indica el algoritmo hash que se usó al crear el paquete de la aplicación. Por ejemplo:

<BlockMap xmlns="http://schemas.microsoft.com/appx/2010/blockmap" 
HashMethod="https://www.w3.org/2001/04/xmlenc#sha256">

El elemento BlockMap anterior indica que se usó el algoritmo SHA256. En esta tabla se muestra la asignación de los algoritmos disponibles actualmente:

Valor HashMethod hashAlgorithm que se va a usar
https://www.w3.org/2001/04/xmlenc#sha256 SHA256 (valor predeterminado de .appx)
https://www.w3.org/2001/04/xmldsig-more#sha384 SHA384
https://www.w3.org/2001/04/xmlenc#sha512 SHA512

Paso 2: Ejecutar SignTool.exe para firmar el paquete

Para firmar el paquete con un certificado de firma de un archivo .pfx

  • SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password filepath.appx
    

SignTool usa el parámetro /fd hashAlgorithm en SHA1 si no se especifica y SHA1 no es válido para firmar paquetes de aplicación. Por lo tanto, debe especificar este parámetro al firmar un paquete de aplicación. Para firmar un paquete de aplicación que se creó con el hash SHA256 predeterminado, especifique el parámetro /fd hashAlgorithm como SHA256:

SignTool sign /fd SHA256 /a /f signingCert.pfx /p password filepath.appx

Puede omitir el parámetro /p password si usa un archivo .pfx que no está protegido por contraseña. También puede usar otras opciones de selección de certificados compatibles con SignTool para firmar paquetes de aplicaciones. Para obtener más información sobre estas opciones, consulta SignTool.

Nota:

No puede usar la operación de marca de tiempo signTool en un paquete de aplicación firmado; no se admite la operación.

Si quiere marcar la hora del paquete de la aplicación, debe hacerlo durante la operación de inicio de sesión. Por ejemplo:

SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password /tr timestampServerUrl 
filepath.appx

Haga que el parámetro /tr timestampServerUrl sea igual a la dirección URL de un servidor de marca de tiempo RFC 3161.

Observaciones

En esta sección se describe la solución de problemas de errores de firma de paquetes de aplicaciones.

Solución de problemas de errores de firma de paquetes de aplicación

Además de los errores de firma que SignTool puede devolver, SignTool también puede devolver errores específicos de la firma de paquetes de aplicación. Estos errores suelen aparecer como errores internos:

SignTool Error: An unexpected internal error has occurred.
Error information: "Error: SignerSign() failed." (-2147024885 / 0x8007000B) 

Si el código de error comienza con 0x8008, como 0x80080206 APPX_E_CORRUPT_CONTENT), indica que el paquete que se firma no es válido. En este caso, para poder firmar el paquete, debe recompilar el paquete. Para obtener la lista completa de errores de 0x8008*, consulte Códigos de error COM (seguridad y configuración).

Normalmente, el error es 0x8007000b (ERROR_BAD_FORMAT). En este caso, puede encontrar información de error más específica en el registro de eventos:

Para buscar en el registro de eventos

  1. Ejecute Eventvwr.msc.
  2. Abra el registro de eventos: Visor de eventos (local) > Registros > de aplicaciones y servicios de Microsoft > Windows > AppxPackagingOM > Microsoft-Windows-AppxPackaging/Operational
  3. Busque el evento de error más reciente.

El error interno normalmente corresponde a uno de estos:

Id. de evento Cadena de evento de ejemplo Sugerencia
150 error 0x8007000B: el nombre del publicador del manifiesto de la aplicación (CN=Contoso) debe coincidir con el nombre del firmante del certificado de firma (CN=Contoso, C=US). El nombre del publicador del manifiesto de la aplicación debe coincidir exactamente con el nombre del firmante de la firma. Nota: Estos nombres se especifican entre comillas y distinguen mayúsculas de minúsculas y espacios en blanco.
Puede actualizar la cadena de atributo Publisher definida para el elemento Identity en el archivo de AppxManifest.xml para que coincida con el nombre del firmante del certificado de firma previsto. O bien, seleccione un certificado de firma diferente con un nombre de firmante que coincida con el nombre del publicador del manifiesto de la aplicación. El nombre del publicador del manifiesto y el nombre del firmante del certificado aparecen en el mensaje de evento.
151 error 0x8007000B: el método hash de firma especificado (SHA512) debe coincidir con el método hash usado en la asignación de bloques del paquete de la aplicación (SHA256). El hashAlgorithm especificado en el parámetro /fd es incorrecto (vea Paso 1: Determinar el algoritmo hash que se va a usar). Vuelva a ejecutar SignTool con el hashAlgorithm que coincida con el mapa de bloques del paquete de la aplicación.
152 error 0x8007000B: el contenido del paquete de la aplicación debe validarse con su asignación de bloques. El paquete de la aplicación está dañado y debe volver a compilarse para generar un nuevo mapa de bloques. Para obtener más información sobre cómo crear un paquete de aplicación, consulte Creación de un paquete de aplicación con el empaquetador de aplicaciones o Creación de un paquete de aplicación con Visual Studio 2012.

Consideraciones sobre la seguridad

Una vez firmado el paquete, el certificado que usó para firmar el paquete debe ser de confianza para el equipo en el que se va a implementar el paquete. Al agregar un certificado a los almacenes de certificados de equipo local, afecta a la confianza de certificado de todos los usuarios del equipo. Se recomienda instalar los certificados de firma de código que desee para probar paquetes de aplicaciones en el almacén de certificados de Personas de confianza y quitarlos inmediatamente cuando ya no sea necesario. Si crea sus propios certificados de prueba para firmar paquetes de aplicaciones, también se recomienda restringir los privilegios asociados al certificado de prueba. Para obtener más información sobre cómo crear certificados de prueba para firmar paquetes de aplicaciones, consulta Creación de un certificado de firma de paquetes de aplicación.

Muestras

Creación de un ejemplo de paquete de aplicación

Conceptos

Procedimientos recomendados de firma de código

Firma de un paquete en Visual Studio 2012

SignTool

Paquete de la aplicación (MakeAppx.exe)

How to create an app package signing certificate (Cómo crear un certificado de firma del paquete de la aplicación)