Condividi tramite


Firma HLK con un modulo di protezione hardware

Introduzione

Questo argomento descrive alcuni dei problemi di installazione e configurazione che possono verificarsi quando si usa un modulo HSM (Hardware Security Module) basato su rete di terze parti per archiviare i certificati di convalida estesa (EV).

Sfondo

Creazione di pacchetti HLK

I file di pacchetto HLKX usano Open Packaging Conventions. La specifica fa parte di un gruppo di lavoro ISO, implicando che i file HLKX non sono compatibili con Signtool.

Firma del pacchetto HLK

Quando HLK firma un pacchetto, le firme e le relazioni vengono inserite nel pacchetto insieme ai dati HLK. Si tratta dei dati usati System.IO.Packaging.PackageDigitalSignature per convalidare la firma sui dati nel pacchetto.

Nota

Attualmente, la firma del pacchetto HLK supporta solo i certificati RSA e DSA, come determinato dalla libreria .NET usata per firmare System.Security.Cryptography.Xml.SignedXml

Provider di servizi di crittografia

Un provider di servizi di crittografia (CSP) contiene implementazioni di algoritmi e standard di crittografia. Come minimo, un CSP è costituito da una libreria a collegamento dinamico (DLL) che implementa le funzioni in CryptoSPI (un'interfaccia del programma di sistema). La maggior parte dei CSP contiene l'implementazione di tutte le proprie funzioni. Alcuni CSP, tuttavia, implementano le relative funzioni principalmente in un programma di servizio basato su Windows gestito dal gestore di controllo dei servizi di Windows. Altri implementano funzioni nell'hardware, ad esempio una smart card o un coprocessore sicuro. Se un provider di servizi di configurazione non implementa le proprie funzioni, la DLL funge da livello pass-through, semplificando la comunicazione tra il sistema operativo e l'implementazione CSP effettiva.

Archivio certificati e Registro di sistema

I certificati nell'archivio certificati eseguono il mapping a una DLL CSP che eseguirà la firma finale. Questa operazione può essere visualizzata nella voce del Registro di sistema seguente.

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider]
"Image Path"="%SystemRoot%\\system32\\dssenh.dll"
"SigInFile"=dword:00000000
"Type"=dword:0000000d

Firma di pacchetti HLKX con un certificato ospitato da un modulo di protezione hardware basato sulla rete

Configurazione del controller

Per configurare un controller HLK per la firma con un certificato HSM, è necessario che nel sistema siano presenti gli elementi seguenti:

  • Autorità di certificazione (CA) dal modulo di protezione hardware
  • Un file CSP dal modulo di protezione hardware

Le istruzioni su come configurare un client HSM con questi componenti devono essere documentate dal provider HSM.

Firma con HLK

Se il controller è configurato correttamente, dovrebbe essere possibile puntare al certificato dal modulo di protezione hardware come si farebbe con un certificato installato localmente da HLK e firmare il pacchetto.

Test della configurazione del modulo di protezione hardware

Uso di Signtool

Il primo passaggio per capire se è possibile firmare consiste nel tentare di firmare un file usando signtool. Ciò consentirà di verificare che il flusso di lavoro di firma funzioni correttamente. Prima di tutto si firmerà un file PE (exe o dll). Ad esempio, firma con un nome:

signtool sign /f HighValue.cer /csp "Hardware Cryptography Module" /kHighValueContainerMyControl.exe
signtool sign /n "My Company Certificate" MyFile.exe

oppure per firmare usando l'hash SHA1 del certificato installato:

signtool sign /sha1 0cf1d2f7befc7d143678f86963aef5572b710cf2 MyFile.exe

Il nome del certificato è disponibile nelle informazioni sull'oggetto e l'hash SHA1 si trova nell'identificazione personale. Quando si usa l'hash rimuovere tutti gli spazi e i caratteri speciali presenti nell'hash in modo che il formato sia simile all'esempio precedente. È anche possibile firmare usando un file PFX (Personal Information Exchange ). Questo non è probabilmente ciò che si vuole fare, poiché un file PFX può contenere la chiave privata, in cui un certificato contiene solo la chiave pubblica.

signtool sign /f certdata.pfx MyFile.exe

È possibile verificare la firma usando signtool

signtool verify /v /pa MyFile.exe

Se è stato possibile firmare e verificare un file usando qualsiasi elemento ad eccezione di un file PFX, è possibile provare a firmare un pacchetto HLK. Se non è stato possibile firmare, vedere la sezione Risoluzione dei problemi.

Uso di PackageDigitalSignature

Nella sezione Esempi di codice è riportato un esempio di firma usando PackageDigitalSignature alla fine di questo documento. Al momento della ricezione del documento, dovrebbe essere stato ottenuto anche il file C# completo. Per usare questo esempio, è necessario specificare un percorso completo per il pacchetto non firmato e l'identificazione personale del certificato che si intende usare per la firma. Se non è stato possibile firmare, vedere la sezione Risoluzione dei problemi.

Risoluzione dei problemi

La causa più probabile è che non esiste un certificato e un CSP associato installato nel sistema dal modulo di protezione hardware. Di seguito sono riportate alcune delle operazioni che è possibile provare:

  • È possibile accedere a questo sistema usando solo gli strumenti supportati dal fornitore del modulo di protezione hardware?
  • Il fornitore del modulo di protezione hardware installa un certificato e un CSP in questo sistema?
    • Quali sono le proprietà del certificato?
  • Il fornitore del modulo di protezione hardware supporta e documenta l'uso di signtool? Se un file può essere firmato con Signtool con un modulo di protezione hardware, si tratta di un indicatore che il sistema è stato configurato correttamente e implica che HLK può anche firmare pacchetti HLKX.
  • Quando si esegue il codice di esempio (HSM_example.cs) che cosa viene stampato per CspKeyContainerInfo.ProviderName
    • Esegue il mapping del nome del provider alla DLL CSP fornita da vender corretta. Queste informazioni sono disponibili nel Registro di sistema, come illustrato in precedenza.

Esempi di codice

PackageDigitalSignatureManager

public static void Sign(string package, X509Certificate2 certificate)
{
  // Open the package to sign it
  Package packageToSign = Package.Open(package);

  // Specify that the digital signature should exist 
  // embedded in the signature part
  PackageDigitalSignatureManager signatureManager = new PackageDigitalSignatureManager(packageToSign);

  signatureManager.CertificateOption = CertificateEmbeddingOption.InCertificatePart;

  // We want to sign every part in the package
  List<Uri> partsToSign = new List<Uri>();
  foreach (PackagePart part in packageToSign.GetParts())
  {
    partsToSign.Add(part.Uri);
  }

  // We will sign every relationship by type
  // This will mean the signature is invalidated if *anything* is modified in                           //the package post-signing
  List<PackageRelationshipSelector> relationshipSelectors = new List<PackageRelationshipSelector>();

  foreach (PackageRelationship relationship in packageToSign.GetRelationships())
  {
    relationshipSelectors.Add(new PackageRelationshipSelector(relationship.SourceUri, PackageRelationshipSelectorType.Type, relationship.RelationshipType));
  }

  try
  {
    signatureManager.Sign(partsToSign, certificate, relationshipSelectors);
  }
  finally
  {
    packageToSign.Close();
  }
}