Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La firma es una de las tareas críticas que se deben realizar al trabajar con paquetes MSIX. Si un paquete MSIX no está firmado con un certificado de confianza, los usuarios no podrán instalar la aplicación. Al mismo tiempo, la firma es una de las tareas más críticas también cuando se trata de seguridad. Los certificados deben almacenarse de forma segura para evitar que los actores malintencionados puedan reutilizarlos para firmar sus aplicaciones con nuestra identidad. Azure Key Vault es la mejor opción para admitir este requisito.
En este artículo veremos cómo podemos aprovechar Azure Key Vault en una canalización de CI/CD, de modo que podamos firmar automáticamente nuestro paquete MSIX como parte del proceso.
Importante
El proceso descrito en este artículo se basa en una herramienta de código abierto denominada Azure SignTool, que funciona tanto con Azure Pipelines como con Acciones de GitHub. Si usa Azure Pipelines, también puede aprovechar las extensiones MSIX en combinación con la tarea Azure Key Vault.
Prerrequisitos
- Una cuenta de Azure. Si aún no tiene una cuenta de Azure, comience aquí.
- Una instancia de Azure Key Vault. Para obtener más información, consulte Creación de un almacén de claves.
- Un certificado de firma de paquete válido importado en Azure Key Vault. El certificado predeterminado generado por Azure Key Vault no funcionará para la firma de código. Para obtener más información sobre cómo crear un certificado de firma de paquete, consulte Creación de un certificado para la firma de paquetes.
- Un pipeline de CI/CD que genera un paquete MSIX, hospedado en Azure Pipelines o GitHub Actions. Para obtener más información, consulte Configuración de la canalización de CI/CD con un archivo YAML.
Registro de una aplicación en Azure
Para firmar el paquete como parte de la canalización de CI/CD, vamos a usar una herramienta denominada Azure SignTool. Funciona como la utilidad SignTool estándar incluida en el SDK de Windows 10, pero, en lugar de usar un certificado local, se conecta a Azure Key Vault para usar uno de los certificados disponibles. Sin embargo, para establecer la conexión, primero es necesario registrar una aplicación en Azure, lo que nos proporcionará las credenciales que necesitamos para permitir que Azure SignTool se autentique en nuestro servicio Azure Key Vault.
Abra Azure Portal y elija Azure Active Directory entre los servicios disponibles. Haga clic en Registros de aplicaciones y elija Nuevo registro para iniciar el proceso. Asigne un nombre a la aplicación (por ejemplo, es SignToolForContoso en la imagen siguiente) y, a continuación, deje la configuración predeterminada.
El siguiente paso es tratar la aplicación como un cliente público, ya que estamos en un escenario en el que no se necesita un URI de redirección. Vaya a la sección Autenticación y, en Configuración avanzada, cambie el modificador Tratar la aplicación como cliente público a Sí.
El último paso es crear un secreto de cliente, que es la contraseña que necesitaremos para autenticarse desde Azure SignTool. Vaya a la sección Certificados y secretos y haga clic en Nuevo secreto de cliente. Asígnele un nombre, elija una expiración y presione el botón Agregar . Se le redirigirá de vuelta a la página principal, donde el secreto se mostrará junto con su valor. Asegúrese de copiarlo y almacenarlo en algún lugar seguro. No podrá recuperarlo de nuevo. En cuanto actualice la página, el secreto se enmascarará y no habrá ninguna manera de revelarlo. La única opción será generar un nuevo secreto.
Hay una última información que debe guardar junto con el secreto de cliente: el identificador de la aplicación. Vuelva al inicio de la aplicación (haciendo clic en Información general) y, en la sección superior, busque el valor Application (client) ID (Aplicación [cliente]):
Habilitación del acceso a Azure Key Vault
El siguiente paso es configurar la aplicación de Azure que acabamos de crear para acceder al servicio Azure Key Vault. En Azure Portal, vaya a la instancia de Azure Key Vault que contiene el certificado que desea usar para firmar el paquete MSIX. Vaya a la sección Directivas de acceso y haga clic en Agregar directiva de acceso. La herramienta admite la elección de una de las plantillas disponibles para definir los permisos que queremos conceder, pero, en nuestro escenario, ninguno de ellos es el ajuste adecuado. Por lo tanto, tendremos que establecer manualmente, con las listas desplegables, las siguientes opciones:
- En Permisos de clave, habilite la opción Firmar .
- En Permisos de certificado, habilite la opción Obtener .
El último paso importante es especificar qué aplicación va a acceder a esta directiva. Haga clic en Seleccionar principal y busque la aplicación de Azure que ha creado en el paso anterior utilizando su nombre. En el ejemplo, se denomina SignToolForContoso.
Una vez que lo haya encontrado, presione Seleccionar. Así es como debería ser la directiva.
Cuando haya completado el proceso, haga clic en Agregar para crear la directiva.
Uso de Azure SignTool para firmar el paquete localmente
Ahora que se ha completado la configuración de Azure, podemos usar Azure SignTool para firmar el paquete. En esta sección, usaremos la herramienta localmente para familiarizarse con ella. En las secciones siguientes, la usaremos como parte de una canalización de CI/CD.
La herramienta está disponible como una herramienta global de .NET. Asegúrese de tener instalado el SDK de .NET más reciente y, a continuación, abra una terminal de comandos y ejecute el siguiente comando:
dotnet tool install --global AzureSignTool
Ahora puede firmar el paquete mediante el comando AzureSignTool, que requiere los parámetros siguientes:
kvu
es la dirección URL de Azure Key Vault. Puede buscarla en la página principal del servicio de Azure Portal, en Nombre DNS.kvi
es el identificador de aplicación de la aplicación de Azure que ha registrado y que ha anotado anteriormente.kvs
es el secreto de cliente que ha generado anteriormente y que ha anotado anteriormente.kvc
es el nombre descriptivo del certificado que desea usar.tr
es la dirección URL de un servidor de marca de tiempo. Con esta opción, podemos permitir que nuestro paquete funcione también cuando expire el certificado.v
es la ruta de acceso del paquete de MSIX que queremos firmar.
Este es un comando de ejemplo:
AzureSignTool sign -kvt "<tenantID>" -kvu "https://contosoexpenses-blog.vault.azure.net/" -kvi "aaaabbbb-0000-cccc-1111-dddd2222eeee" -kvs "this-is-the-secret" -kvc "MyCertificate" -tr http://timestamp.digicert.com -v .\MyContosoApp.msix
Nota:
Para más información sobre AzureSignTool, ejecute AzureSignTool sign --help
Uso de Azure SignTool con Azure Pipelines
En esta sección se supone que ya tiene una canalización de CI/CD para una aplicación windows configurada con un archivo YAML en Azure Pipelines, como se explica aquí.
Al principio, deberá crear algunas variables para almacenar la información que requiere Azure SignTool para conectarse a Azure Key Vault. En Azure DevOps, seleccione la canalización y presione el botón Editar en la parte superior. Una vez que esté en el editor de YAML, haga clic en el botón Variables de la parte superior para abrir el panel. Va a hacer clic en el botón + para agregar las siguientes variables:
- AzureKeyVaultName, con el nombre descriptivo del almacén.
- AzureKeyVaultUrl, con la dirección URL del almacén.
- AzureKeyVaultClientId, con el identificador de aplicación de la aplicación de Azure.
- AzureKeyVaultClientSecret, con el secreto de cliente de tu aplicación de Azure.
Al crear cada variable, asegúrese de habilitar la opción Mantener este valor secreto. Esto garantizará que otras personas que tienen acceso a la canalización no podrán ver sus valores.
Ahora puede personalizar la canalización de YAML existente agregando una tarea de .NET Core para instalar Azure SignTool en el agente. Este es el código YAML que se va a agregar:
- task: DotNetCoreCLI@2
displayName: 'Install Azure SignTool'
inputs:
command: custom
custom: tool
arguments: 'install --global AzureSignTool'
El siguiente paso consiste en agregar una tarea de PowerShell para ejecutar el comando que firmará el paquete. Debe realizar esta tarea solo al final del proceso de compilación, una vez creado el paquete MSIX.
- powershell: '& AzureSignTool sign -kvu $(AzureKeyVaultUrl) -kvi $(AzureKeyVaultClientId) -kvs $(AzureKeyVaultClientSecret) -kvc $(AzureKeyVaultName) -tr http://timestamp.digicert.com -v "$(System.DefaultWorkingDirectory)\MyPipeline\MyContosoApp\MyContosoApp.msix"'
displayName: 'Sign the package'
El comando es similar al que hemos usado para firmar el paquete localmente. Las únicas diferencias son:
- En lugar de usar valores fijos para los distintos parámetros, se usan las variables que hemos creado con la sintaxis $(Variable-Name)
- La ruta de acceso del paquete MSIX apunta a la carpeta del agente donde se crea el paquete MSIX al final de la compilación.
Uso de Azure SignTool con Acciones de GitHub
En esta sección se supone que ya tiene una canalización de CI/CD para una aplicación windows configurada con un archivo YAML en Acciones de GitHub, como se explica aquí.
Como primer paso, como hicimos en Azure Pipeline, es necesario almacenar las credenciales de forma segura. GitHub usa secretos y se pueden agregar en la configuración del repositorio. Una vez que esté en el repositorio de GitHub que hospeda la aplicación windows, haga clic en Configuración y, a continuación, vaya a Secretos.
De forma similar a lo que hizo con Azure Pipelines, hará clic en Nuevo secreto para crear cuatro secretos:
- AzureKeyVaultName, con el nombre descriptivo del almacén.
- AzureKeyVaultUrl, con la dirección URL del almacén.
- AzureKeyVaultClientId, con el identificador de aplicación de la aplicación de Azure.
- AzureKeyVaultClientSecret, con el secreto de cliente de su aplicación de Azure.
La diferencia con Azure Pipeline es que los secretos están ocultos implícitamente, por lo que no tendrá que habilitar ninguna opción para protegerlos.
Ahora, a través de la pestaña Acciones del repositorio, puede abrir el flujo de trabajo existente y agregar las tareas que necesita para realizar la firma. La primera instalará azureSign Tool en el agente:
- name: Install AzureSignTool
run: dotnet tool install --global AzureSignTool
La segunda firmará el paquete y, como tal, se debe ejecutar después de que se haya completado la compilación de Visual Studio y se haya generado el paquete MSIX.
- name: Sign package
run: |
Get-ChildItem -recurse -Include **.msix | ForEach-Object {
$msixPath = $_.FullName
& AzureSignTool sign -kvu "${{ secrets.AzureKeyVaultUrl }}" -kvi "${{ secrets.AzureKeyVaultClientId }}" -kvs "${{ secrets.AzureKeyVaultClientSecret }}" -kvc ${{ secrets.AzureKeyVaultName }} -tr http://timestamp.digicert.com -v $msixPath
}
Hay algunas diferencias en esta tarea en comparación con la que usamos en Azure Pipelines. La primera es que GitHub usa una sintaxis diferente para acceder a los secretos, que es ${{ secrets. SECRET_NAME }}. Por lo tanto, los distintos parámetros se rellenan con los valores que hemos creado anteriormente en la sección Secretos. Lo otro es que necesita usar un enfoque diferente para buscar los paquetes MSIX que se deben firmar. La tarea, en lugar de apuntar a un paquete MSIX específico, usa un script de PowerShell que recorre en iteración todos los archivos almacenados en la salida de la compilación. Si el archivo tiene la extensión MSIX, usará el comando AzureSignTool para firmarlo.
Implementación del paquete
Independientemente de la plataforma de CI/CD que prefiera, al final del flujo tendrá un paquete MSIX firmado con el certificado almacenado en Azure Key Vault. Ahora puedes usar cualquier otra tarea disponible para implementar el paquete con tu elección preferida de distribución: Microsoft Store, un sitio web, Microsoft Intune, etc.