Créer un module de sortie pour l'autorité de certification dans C#

Microsoft Active Directory Certificate Services offre la possibilité de créer ses propres Policy- und Exit Module de développer les fonctionnalités de l'autorité de certification.

Voici les étapes nécessaires pour créer un module Exit dans C# avec Visual Studio 2019. Le module Exit écrira les certificats émis dans un répertoire configurable du système de fichiers.

Nous remercions un auteur dont le nom n'est pas mentionné d'avoir rédigé la plupart des travaux préparatoires ont déjà été effectués. Je tiens à remercier cette personne ! J'ai utilisé son exemple de code comme point de départ.

Se procurer Visual Studio

Visual Studio 2019 peut être obtenu gratuitement auprès de Microsoft dans l'édition communautaire. Veuillez consulter les conditions de licence et en tenir compte.

Lors de l'installation, l'option „Desktop Development with C#“ doit être sélectionnée.

Créer des assemblages interop

Connaissez-vous TameMyCerts? TameMyCerts est un add-on pour l'autorité de certification Microsoft (Active Directory Certificate Services). Il étend la fonction de l'autorité de certification et permet de Application de la réglementationIl s'agit d'un logiciel de gestion des certificats qui permet d'automatiser l'émission de certificats en toute sécurité. TameMyCerts est unique dans l'écosystème Microsoft, a déjà fait ses preuves dans d'innombrables entreprises du monde entier et est disponible sous une licence libre. Il peut téléchargé via GitHub et être utilisé gratuitement. Une maintenance professionnelle est également proposée.

Le développement ne doit pas être effectué sur un système sur lequel l'autorité de certification est installée. Un PC Windows 10 habituel est suffisant. Nous avons toutefois besoin de deux fichiers DLL de l'autorité de certification, qui doivent être copiés à partir d'un système Windows Server :

  • certxds.dll
  • certcli.dll

Les deux fichiers DLL se trouvent sur le serveur de l'autorité de certification sous C:\NWindows\NSystem32.

Pour ces deux fichiers DLL, des fichiers interop doivent être créés. Cela peut se faire avec le programme tlbimport, qui est livré avec Visual Studio.

Pour ce faire, on lance le Developer Command Prompt. On saisit ensuite les commandes suivantes :

tlbimp certxds.dll
tlbimp certcli.dll

Cette commande va permettre d'exécuter les deux Assemblages Interop en tant que fichiers DLL :

  • CERTEXITLib.dll
  • CERTCLILib.dll

Personnaliser le fichier CERTCLILIB.dll

Lors de la traduction du code C++ sous-jacent en C#, la conversion des types de données n'est pas toujours correcte (voir ici pour plus d'informations). C'est pourquoi la CERTCLILIB qui vient d'être générée doit d'abord être désassemblée :

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\ildasm.exe" ^
CERTCLILib.dll ^
/out:CERTCLILIB.il

Le fichier original CERTCLILIB.dll doit maintenant être supprimé.

A l'intérieur du CERTCLILIB.in, toutes les occurrences de GetCertificateProperty sont échangées par...

GetCertificateProperty([in] string  marshal( bstr) strPropertyName,
                       [in] int32 PropertyType) runtime managed internalcall

Trop de...

GetCertificateProperty([in] string  marshal( bstr) strPropertyName,
                       [in] int32 PropertyType,
                       [out] native int pvarPropertyValue) runtime managed internalcall

Si l'on souhaite utiliser GetRequestProperty pour lire par exemple l'attribut „RawRequest“, il faut procéder de la même manière pour GetRequestProperty.

La DLL peut ensuite être réassemblée.

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm.exe" ^
/DLL CERTCLILIB.il ^
/res:CERTCLILIB.res ^
/out=CERTCLILIB.dll

Créer un projet

Après le démarrage de Visual Studio, un nouveau projet est créé.

Nous avons besoin d'une Class Library avec le framework .NET.

L'étape suivante consiste à donner un nom au projet et à lui attribuer un lieu de rayon, puis le projet peut commencer.

Référencement des fichiers DLL Interop

Les fichiers DLL Interop CERTEXITLib.dll et CERTCLILib.dll créés précédemment sont copiés dans le répertoire du projet.

Ensuite, les deux fichiers DLL sont référencés.

Création des fichiers de classe

Deux classes doivent être créées. Des exemples pour les deux fichiers de classe se trouvent dans mon exemple de projet sur GitHub :

Attribuer un nouveau GUID

Si le fichier d'exemple doit être utilisé, un nouveau GUID doit être saisi dans chacun des deux fichiers.

Le GUID ne doit pas être utilisé dans les deux fichiers pas être identiques.

Un nouveau GUID peut par exemple être créé avec la commande PowerShell „New-Guid“.

New-GUID

Définir les paramètres du module

Les paramètres du module tels que le nom, la description, la version et l'avis de copyright peuvent être définis dans la méthode GetProperty du fichier ExitManageClass.cs.

Traduction du code source

Le module Exit peut maintenant être compilé.

Enregistrement du module de sortie sur l'autorité de certification

Le fichier DLL généré peut maintenant être copié sur le serveur cible. Il doit être enregistré dans deux répertoires :

  • C:\Windows\System32
  • C:\Windows\SysWOW64

Ensuite, le fichier DLL doit être enregistré à l'aide de la commande suivante :

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe ^
C:\Windows\System32\MyFirstExitModule.dll

Le fichier regasm.exe est l'équivalent .NET de regsvr32.exe.

Le processus certsvr est un processus 64 bits, c'est pourquoi la DLL doit également être enregistrée en tant que 64 bits (regasm.exe depuis le répertoire Framework64). Les versions actuelles de Windows ne sont livrées qu'en 64 bits, mais historiquement, il existait aussi des versions 32 bits du service.

Dans mon exemple de projet sur GitHub, il y a aussi un Script d'installation/désinstallation.

Configurer le module Exit

Dans le projet exemple, le module Exit écrit les certificats émis dans un dossier du système de fichiers. Le chemin doit être configuré comme REG_SZ (String Value) nommé „OutputDirectory“ sous la clé de registre suivante.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\{Common-Name-der-Zertifizierungsstelle}\ExitModules\MyFirstExitModule

Redémarrer le service d'autorité de certification

Il faut ensuite redémarrer le service d'autorité de certification.

net stop certsvc
net start certsvc

Si le module de sortie ne peut pas être chargé ou s'il provoque une erreur, l'autorité de certification Événement n° 46 enregistrer.

Si l'on ouvre maintenant la console d'administration pour l'autorité de certification (certsrv.msc), le module de sortie nouvellement créé devrait être disponible dans l'onglet „Exit Modules“ sous „Add“.

Si l'autorité de certification délivre un certificat, celui-ci devrait maintenant être exporté dans le répertoire configuré.

À partir de là, le projet est prêt pour des développements personnels. Voici quelques idées :

  • Enregistrement des certificats émis dans une base de données
  • Signaler directement à une base de données un changement d'état de révocation (révocation/dévocation) d'un certificat.
  • Exportation directe des numéros de série des certificats dans le système de fichiers pour le Good déterministe du répondeur en ligne (OCSP)
  • Appel d'une API web pour transmettre les informations relatives aux certificats en vue d'un traitement ultérieur (certificats émis, révocations, déblocages)
  • Entwicklung eines Exit Moduls, welches per SMTP Nachrichten versenden kann und contrairement au module standard Microsoft Exit fonctionne également sur Server Core

Liens complémentaires :

Sources externes

Les commentaires sont fermés.

fr_FRFrançais