In questi giorni, ho avuto l’opportunità di esplorare il rinnovo di un certificato di code-signing utilizzato per autenticare e firmare digitalmente file contenenti codice eseguibile all’interno di un flusso di integrazione e distribuzione continua (CI/CD).
Durante la ricerca del certificato più idoneo, ho scoperto la nuova disposizione introdotta dal CA/Browser Forum, che dal 1° giugno 2023 impone che tutti i certificati di code-signing siano disponibili su token USB. La soluzione di firma tramite token USB non è però compatibile con i flussi CI/CD a causa del suo meccanismo di firma basato sugli eventi, rendendola poco pratica per gli ambienti di integrazione continua, anche all’interno di zone protette.
Inoltre, la soluzione di firma tramite token USB non si integra bene con le piattaforme cloud come Azure DevOps o GitHub Workflow.
Una alternativa al token USB è rappresentata dalla possibilità di dotarsi di un server HSM (Hardware Security Module) on-premise o in cloud.
Dopo aver condotto alcune ricerche e beneficiato dei consigli dell’amico Giuliano Latini, che ringrazio, ho optato per un certificato di code-signing di tipo Azure Key Vault, gestito da DigiCert tramite il portale SignMyCode.
Una volta acquistato il certificato, è necessario seguire una procedura di accreditamento, durante la quale si ricevono istruzioni chiare e dettagliate tramite email. Successivamente, il certificato viene sottoposto a convalida. Come parte del processo di convalida, è necessario confermare l’autorità di acquisto del certificato per conto dell’organizzazione. Questo richiede di fornire un numero di telefono verificato e pubblicamente elencato, consentendo all’autorità di certificazione di interagire direttamente con voi o con un rappresentante dell’organizzazione. Il processo di accreditamento e convalida può richiedere diversi giorni. Nel frattempo, consiglio di preparare l’ambiente Azure per ospitare il certificato che verrà emesso all’interno di un Key Vault.
La preparazione dell’ambiente Azure include:
- La scelta della sottoscrizione Azure (nel caso di più sottoscrizioni) in cui posizionare il Key Vault
- Configuring the Azure Key Vault to store code-signing certificates
- Creating the Key Vault, Certificate Signing Request (CSR), and importing the code-signing certificate into Azure KeyVault HSM
Una volta completato il processo di convalida, verrà emesso un file con estensione .pem che dovrà essere importato nel Key Vault Azure precedentemente creato. È possibile seguire la procedura descritta in questo articolo:
Il certificato di code-signing è ora custodito in Azure Key Vault e può essere utilizzato con diversi signing tools, tra questi AzureSignTool e .NET SignTool. Collocati all’interno di un processo di CI/CD, I tool di firma possono essere utilizzati, per esempio, in una pipeline Jenkins oppure all’interno di un GitHub Workflow; di seguito alcuni link molto utili a risorse che descrivono come ottenere i secret(s) da Azure Key Vault e come configurare i tool di firma:
- Firma della pipeline MSIX e CI/CD con Azure Key Vault
- Code Signing Using Azure Pipelines and Azure Key Vault (advancedinstaller.com)
- Migrate to Azure role-based access control | Microsoft Learn
- Grant permission to applications to access an Azure key vault using Azure RBAC | Microsoft Learn
L’ultimo link è particolarmente utile per la configurazione dei ruoli di accesso (RBAC) che è necessario fornire all’App Azure precedentemente creata.
Per volumi elevati di firme e quando è necessario un modulo hardware di sicurezza (HSM) on-premise oppure in cloud, sono disponibili soluzioni alternative. Una di queste, a mio parere, molto ben strutturata, è rappresentata dal servizio CodeSign Secure offerto da Encryption Consulting LLC. Questo servizio si integra perfettamente con Jenkins e GitHub Workflow, come descritto nei seguenti video:
- Integrazione CI/CD della firma del codice con Jenkins
- Code Sign Secure: Configurazione della verifica della compilazione con GitHub Workflows
Buon divertimento con i certificati di firma digitale.