Partager via


Signature HLK avec un HSM

Introduction

Cette rubrique décrit certains des problèmes de configuration et de mise en place qui peuvent survenir lors de l’utilisation d’un module de sécurité matériel (HSM) basé sur un réseau tiers pour stocker les certificats de validation étendue (EV).

Contexte

HLK Packaging

Les fichiers de package HLKX utilisent les Open Packaging Conventions. La spécification fait partie d’un groupe de travail ISO, ce qui implique que les fichiers HLKX ne sont pas compatibles avec Signtool.

Signature du HLK Package

Lorsque le HLK signe un package, la signature et les relations sont placées dans le package aux côtés des données HLK. Ce sont les données que System.IO.Packaging.PackageDigitalSignature utilise pour valider la signature sur les données du package.

Remarque

Actuellement, la signature de package HLK ne prend en charge que les certificats RSA et DSA, comme déterminé par la bibliothèque .NET utilisée pour la signature System.Security.Cryptography.Xml.SignedXml

Cryptographic Service Providers

Un cryptographic service provider (CSP) contient des implémentations de normes et d’algorithmes cryptographiques. À minima, un CSP se compose d’une dynamic-link library (DLL) qui implémente les fonctions dans CryptoSPI (une system program interface). La plupart des CSP contiennent l’implémentation de toutes leurs propres fonctions. Cependant, certains CSP implémentent principalement leurs fonctions dans un programme de service basé sur Windows géré par le gestionnaire de contrôle de service Windows. D’autres implémentent des fonctions dans le matériel, comme une smart card ou un coprocesseur sécurisé. Si un CSP n’implémente pas ses propres fonctions, la DLL agit comme une couche de transit, facilitant la communication entre le système d’exploitation et l’implémentation réelle du CSP.

Certificate Store et Registre

Les certificats dans le Certificate Store sont tous mappés à une DLL CSP qui effectuera la signature finale. Cela peut être vu dans l’entrée de registre ci-dessous.

[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

Signature du HLKX Package avec un Certificat hébergé par un Network-Based HSM

Configuration du pilote

Pour configurer un contrôleur HLK afin de signer avec un certificat HSM, les éléments suivants doivent être présents sur le système :

  • Une Autorité de Certification (CA) de l’HSM
  • Un fichier CSP de l’HSM

Des instructions sur la configuration d’un client HSM avec ces composants doivent être documentées par votre fournisseur HSM.

Signature avec le HLK

Si le contrôleur est correctement configuré, vous devriez pouvoir pointer vers le certificat de l’HSM comme vous le feriez avec un certificat installé localement depuis le HLK et signer le package.

Test de la Configuration HSM

Utilisation de Signtool

La première étape pour comprendre si nous pouvons signer est d’essayer de signer un fichier en utilisant signtool. Cela nous permettra de vérifier que le flux de travail de signature fonctionne correctement. Tout d’abord, nous signerons un fichier PE (exe ou dll). Par exemple, la signature à l’aide d’un nom :

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

ou pour signer en utilisant le hachage SHA1 du certificat installé :

signtool sign /sha1 0cf1d2f7befc7d143678f86963aef5572b710cf2 MyFile.exe

Le nom du certificat se trouve dans les informations du sujet et le hachage SHA1 se trouve dans l’empreinte numérique. Lors de l’utilisation du hachage, supprimez tous les espaces et caractères spéciaux présents dans le hachage afin que le format ressemble à l’exemple ci-dessus. Vous pouvez également signer en utilisant un Personal Information Exchange (PFX) file. Ce n’est probablement pas ce que vous voulez faire, car un fichier PFX peut contenir la clé privée, tandis qu’un certificat contient uniquement la clé publique.

signtool sign /f certdata.pfx MyFile.exe

Vous pouvez vérifier la signature en utilisant signtool

signtool verify /v /pa MyFile.exe

Si vous avez pu signer et vérifier un fichier en utilisant autre chose qu’un fichier PFX, vous pouvez essayer de signer un package HLK. Si vous n’avez pas pu signer, veuillez consulter la section Dépannage.

Utilisation de PackageDigitalSignature

Il existe un exemple de code de signature à l’aide PackageDigitalSignature de la fin de ce document dans la section Exemples de code. Vous devriez également avoir reçu le fichier C# complet lorsque vous avez reçu ce document. Pour utiliser cet exemple, vous devrez fournir un chemin complet vers votre package non signé et l’empreinte numérique du certificat que vous allez utiliser pour la signature. Si vous n’avez pas pu signer, veuillez consulter la section Dépannage.

Résolution des problèmes

La cause la plus probable est qu’il n’y a pas de certificat et de CSP associé installés sur votre système par votre HSM. Voici quelques éléments que vous pourriez essayer :

  • Pouvez-vous signer sur ce système en utilisant uniquement les outils pris en charge par votre fournisseur HSM ?
  • Votre fournisseur HSM installe-t-il un certificat et un CSP sur ce système ?
    • Quelles sont les propriétés du certificat ?
  • Votre fournisseur HSM prend-il en charge et documente-t-il l’utilisation de signtool ? Si un fichier peut être signé en utilisant Signtool avec un HSM, cela indique que le système a été correctement configuré et implique que le HLK peut également signer des packages HLKX.
  • Lorsque vous exécutez l’exemple de code (HSM_example.cs), que s’affiche-t-il pour le CspKeyContainerInfo.ProviderName
    • Ce nom de fournisseur correspond-il à la DLL CSP fournie par le fournisseur ? Ces informations peuvent être trouvées dans le registre comme indiqué ci-dessus.

Exemples de code

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();
  }
}