Creación de un certificado para la firma de paquetes

En este artículo se explica cómo crear y exportar un certificado para la firma de paquetes de aplicación mediante herramientas de PowerShell. Se recomienda usar Visual Studio para empaquetar aplicaciones para UWP y empaquetar aplicaciones de escritorio, pero todavía puede empaquetar una aplicación manualmente si no ha usado Visual Studio para desarrollar la aplicación.

Requisitos previos

  • Una aplicación empaquetada o sin empaquetar
    Una aplicación que contiene un archivo AppxManifest.xml. Deberá hacer referencia al archivo de manifiesto al crear el certificado que se usará para firmar el paquete final de la aplicación. Para obtener más información sobre cómo empaquetar manualmente una aplicación, consulte Creación de un paquete de aplicación con la herramienta MakeAppx.exe.

  • Cmdlets de infraestructura de clave pública (PKI)
    Necesita cmdlets PKI para crear y exportar el certificado de firma. Para más información, consulte Cmdlets de infraestructura de clave pública.

Crear un certificado autofirmado

Un certificado autofirmado es útil para probar la aplicación antes de que esté listo para publicarlo en la Tienda. Siga los pasos descritos en esta sección para crear un certificado autofirmado.

Nota:

Al crear y usar un certificado autofirmado solo los usuarios que instalan y confían en el certificado pueden ejecutar la aplicación. Esto es fácil de implementar para las pruebas, pero puede impedir que otros usuarios instalen la aplicación. Cuando esté listo para publicar la aplicación, se recomienda usar un certificado emitido por un origen de confianza. Este sistema de confianza centralizada ayuda a garantizar que el ecosistema de aplicaciones tenga niveles de comprobación para proteger a los usuarios de actores malintencionados.

Determinar el asunto de la aplicación empaquetada

Para usar un certificado para firmar el paquete de la aplicación, el "Asunto" del certificado debe coincidir con la sección "Editor" del manifiesto de la aplicación.

Por ejemplo, la sección "Identidad" del archivo AppxManifest.xml de la aplicación debe tener un aspecto similar al siguiente:

  <Identity Name="Contoso.AssetTracker" 
    Version="1.0.0.0" 
    Publisher="CN=Contoso Software, O=Contoso Corporation, C=US"/>

El "Editor", en este caso, es "CN=Contoso Software, O=Contoso Corporation, C=US", que debe usarse para crear el certificado.

Utilice New-SelfSignedCertificate para crear un certificado

Use el cmdlet de PowerShell New-SelfSignedCertificate para crear un certificado autofirmado. New-SelfSignedCertificate tiene varios parámetros para la personalización, pero con el fin de este artículo, nos centraremos en la creación de un certificado simple que funcionará con SignTool. Para obtener más ejemplos y usos de este cmdlet, consulte New-SelfSignedCertificate.

En función del archivo AppxManifest.xml del ejemplo anterior, debe usar la siguiente sintaxis para crear un certificado. En un símbolo del sistema de PowerShell con privilegios elevados:

New-SelfSignedCertificate -Type Custom -Subject "CN=Contoso Software, O=Contoso Corporation, C=US" -KeyUsage DigitalSignature -FriendlyName "Your friendly name goes here" -CertStoreLocation "Cert:\CurrentUser\My" -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}")

Tenga en cuenta los detalles siguientes sobre algunos de los parámetros:

  • KeyUsage: este parámetro define para qué se puede usar el certificado. Para un certificado de firma automática, este parámetro debe establecerse en DigitalSignature.

  • TextExtension: este parámetro incluye la configuración de las siguientes extensiones:

    • Uso extendido de claves (EKU): esta extensión indica fines adicionales para los que se puede usar la clave pública certificada. Para un certificado de firma automática, este parámetro debe incluir la cadena de extensión "2.5.29.37={text}1.3.6.1.5.5.7.3.3", que indica que el certificado se va a usar para la firma de código.

    • Restricciones básicas: esta extensión indica si el certificado es una entidad de certificación (CA). Para un certificado de firma automática, este parámetro debe incluir la cadena de extensión "2.5.29.19={text}", que indica que el certificado es una entidad final (no una CA).

Después de ejecutar este comando, el certificado se agregará al almacén de certificados local, tal como se especifica en el parámetro "-CertStoreLocation". El resultado del comando también generará la huella digital del certificado.

Puede ver su certificado en una ventana de PowerShell utilizando los siguientes comandos:

Set-Location Cert:\CurrentUser\My
Get-ChildItem | Format-Table Subject, FriendlyName, Thumbprint

Esto mostrará todos los certificados en el almacén local.

Exportar un certificado

Para exportar el certificado en el almacén local a un archivo de Intercambio de información personal (PFX), use el cmdlet Export-PfxCertificate.

Al usar Export-PfxCertificate, debe crear y usar una contraseña o usar el parámetro "-ProtectTo" para especificar qué usuarios o grupos pueden acceder al archivo sin una contraseña. Tenga en cuenta que se mostrará un error si no usa el parámetro "-Password" o "-ProtectTo".

Uso de contraseñas

$password = ConvertTo-SecureString -String <Your Password> -Force -AsPlainText 
Export-PfxCertificate -cert "Cert:\CurrentUser\My\<Certificate Thumbprint>" -FilePath <FilePath>.pfx -Password $password

Uso de ProtectTo

Export-PfxCertificate -cert Cert:\CurrentUser\My\<Certificate Thumbprint> -FilePath <FilePath>.pfx -ProtectTo <Username or group name>

Después de crear y exportar el certificado, estará listo para firmar el paquete de la aplicación con SignTool. Para obtener el siguiente paso en el proceso de empaquetado manual, consulte Firmar un paquete de aplicación mediante SignTool.

Consideraciones sobre la seguridad

Al agregar un certificado a los almacenes de certificados del equipo local, afecta a la confianza de certificados de todos los usuarios del equipo. Se recomienda quitar esos certificados cuando ya no sean necesarios para evitar que se usen para poner en peligro la confianza del sistema.