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