PI Services

Le blog des collaborateurs de PI Services

ADFS : Metadata incorrectes lors de l'ajout d'une fédération

Introduction

Avec le développement de l'authentification unique en entreprise, ADFS (Active Directory Federation Services) est devenu un rôle de plus en plus déployé. Même si son déploiement reste simple et très documenté (grâce notamment, au déploiement d'Office 365), il est courant de rencontrer des difficultés lorsque l'on souhaite ajouter une fédération ou réaliser une configuration spécifique.

Au cours de cette article, il sera question de résoudre une erreur pouvant se produire lors de l'ajout d'une fédération, c’est-à-dire lorsque l'on veut utiliser son système d'authentification d'entreprise avec un partenaire (une application SAAS par exemple). Généralement, les informations permettant d'établir une fédération sont contenues dans un fichier de métadata qui est accessible depuis une url ou qu'il faut importer via un fichier. Cependant, des erreurs dans le fichier de métadata fourni par le partenaire peuvent empêcher d'avoir une configuration correcte.

Problème rencontré

L'ajout d'une fédération s'effectue dans la console de gestion ADFS via l'action "Add relying party trust" dans le menu "Trust Relationships / Relying Party Trusts".

ADFS Add Federation

Lorsque l'assistant s'ouvre, il est possible de choisir la méthode de configuration de la fédération. Il existe trois méthodes :

  • Une url d'accès au metadata : il s'agit de la méthode nécessitant le moins de maintenance. Les mises à jour des métadata sont prises en compte automatiquement. Si vous souhaitez fournir les vôtres via cette méthode (afin de faciliter la configuration pour le partenaire), il suffit d'ouvrir l'accès à l'url suivante https://NOM_DNS/federationmetadata/2007-06/federationmetadata.xml (n'oublier pas de remplacer NOM_DNS par le nom DNS d'accès au service ADFS).

  • Un fichier de metadata : il s'agit d'un fichier fourni par le partenaire dont le contenu est identique à celui présent via la première méthode.

  • Une configuration manuelle : il faut insérer chaque paramètre manuellement

La méthode qui nous intéresse ici et qui peut poser problème est la seconde. En effet, si le fichier contient des erreurs de syntaxe, le message suivant peut apparaitre :

Some of the content in the federation metadata was skipped because it is not supported by AD FS. Review the properties of the trust carefully before you save te trust to the ADFS configuration database.

Error ADFS Metadata

Même si celle-ci n'est pas bloquante, elle peut entrainer une mauvaise configuration de la fédération.

Résolution

Les conseils ci-dessous sont issues de retour d'expérience. Lorsque l'erreur ci-dessus est rencontrée, il convient de modifier le fichier est de faire des tests de façon dichotomique afin d'obtenir une configuration valide. Par exemple, on peut supprimer les assertions une à une afin de trouver celle(s) qui posent problème. Il faudra ensuite vérifier si elle est nécessaire pour le bon fonctionnement de la fédération (auquel cas, un correctif devra être trouvé) ou si elle peut être supprimée.

La principale erreur rencontrée dans un fichier de métadata est la présence d'assertion pour plusieurs versions  de SAML. En effet ADFS supporte les standards SAML en version 1.0, 1.1 et 2.0 permettant d'échanger des informations avec un partenaire de manière sécurisée. Même si cela permet à un partenaire de ne maintenir qu'un seul fichier de métadata, ADFS ne tolère la présence que d'une version de SAML par fichier. Par exemple, la présence concomitante de ces deux assertions doit être proscrite :

 

Dans ce cas là, il suffira de supprimer les assertions en SAML v1.0.

D'autre part, une erreur courante est d'intégrer des URLs non sécurisées (HTTP au lieu de HTTPS). Cela n'est pas autorisé.

Dernière erreur courante, ADFS est permissif sur la syntaxe et plus précisément sur la casse des assertions. Ainsi, l'assertion suivante est invalide si HTTP-Redirect est remplacé par HTTP-REDIRECT.

 

Aussi, si vous souhaitez accéder à la syntaxe complète du langage SAML afin de valider un fichier de métadata, vous trouverez ci-dessous des liens détaillant la syntaxe selon la version :

ADCS / Erreur : Modèles de certificats non visibles

Problème rencontré

Après l'installation d'une autorité de certification d'entreprise, j'ai rencontré une erreur m'empêchant de publier des modèles de certificats dont la version est supérieures à 1. Ce problème fut rencontré sur Windows 2012 R2 mais ne peut être généralisé à toute installation avec ce système d'exploitation. Néanmoins, cet article permet de résoudre cet incident. Voici tout de même le contexte dans lequel s'est produit ce problème. L'autorité de certification était de type Subordinate  Enterprise et avait été installé avec un fichier CAPolicy.inf contenant notamment la ligne "LoadDefaultTemplates=False". Ce dernier évite de publier les modèles par défaut.

Bien qu'il soit possible de créer des nouveaux modèles dans l'annuaire Active Directory, ces derniers n'étaient pas visibles lors de leur publication via la console de gestion d'autorité de certification.

image

De plus, même les modèles générés par défaut comme “Workstation Authentication” (modèle de version 2) ou encore “OCSP Response Signing” (modèle de version 3) n'apparaissent pas dans la liste des modèles publiables.

Contrairement à un mauvais choix de type d'autorité de certification (standalone au lieu d'enterprise), il reste possible de publier des certificats mais seulement ceux dont le numéro de version est égale à 1.

Solution

Cette erreur est due à un problème de configuration du registre. Pour rappel, les paramètres de configuration de l'autorité de configuration sont stockés dans “HKLM\System\CurrentControlSet\Services\Certsvc\Configuration\NOM_CA” où “NOM_CA” représente le nom de l'autorité de certification.

Pour corriger l'erreur, il faut mettre à jour le registre via la ligne de commande ci-dessous (celle-ci doit être exécutée en mode administrateur) :

Enfin, pour que la modification soit prise en compte, il est nécessaire de redémarrer le service d'autorité de certification. Vous pouvez réaliser cette opération graphiquement ou via les commandes suivantes :

NB : Une KB Microsoft (http://support.microsoft.com/kb/967332) décrit un problème similaire lors de la mise à jour d'une autorité de certification 2003 ou 2008 en édition Standard vers une édition Enterprise de Windows 2008. En effet, seule cette dernière permet d'installer une autorité de certification de type Enterprise. Cependant, cette KB n'existe pas sous Windows 2012 et supérieure. Il n'y a d'ailleurs plus de contrainte sur l'édition du système d'exploitation installée (tous les types d'autorités de certification pouvant être installées sur une édition standard comme datacenter depuis Windows Server 2012). Néanmoins, l'erreur décrite dans cet article peut tout de même être rencontrée.

Script – Certificats venant a expirer

 

Le script ci-dessous interroge le psdrive dédié au magasin de certificat local a la machine pour lister les certificats dont la date d’expiration approche (paramètre $expireInDays) et alerter si le nombre de certificats concernés depasse le seuil donné (Paramètre $NbThreshold).

Le parametre $blacklist permet d’exclure les certificats dont l'expiration est considéré OK (root & co, on Windows Server 2003, 2008 & 2012)

 

 

####################################################### # Script de supervision de la validité des certificats ####################################################### #Parametres: #$expireInDays - Nombre de jour avant expiration #$NbThreshold - Nombre de certificat au dela duquel alerter #N.B: Le script interroge le psdrive cert: local. param ( [int]$expireInDays=60, #Nombre de jour avant expiration [int]$NbThreshold = 0 #Nombre de certificat au dela duquel alerter ) $Scriptname = "check_ceritificate_expiration" #Verification de l'existence d'une source ayant le nom du script dans l'eventlog Application pour loguer certains events Function NewEventSource { if(!(Test-Path "HKLM:\SYSTEM\CurrentControlSet\services\eventlog\Application\$Scriptname")) { New-EventLog -LogName "Application" -Source $Scriptname } } # Exclusion des certificats tiers dont l'expiration est considéré OK (root & co, on Windows Server 2003, 2008 & 2012) $blacklist=@( "109F1CAED645BB78B3EA2B94C0697C740733031C", "12519AE9CD777A560184F1FBD54215222E95E71F", "127633A94F39CBF6EDF7C7BF64C4B535E9706E9A", "18F7C1FCC3090203FD5BAA2F861A754976C8DD25", "23EF3384E21F70F034C467D4CBA6EB61429F174E", "245C97DF7514E7CF2DF8BE72AE957B9E04741E85", "24A40A1F573643A67F0A4B0749F6A22BF28ABB6B", "24BA6D6C8A5B5837A48DB5FAE919EA675C94D217", "2B84BFBB34EE2EF949FE1CBE30AA026416EB2216", "3A850044D8A195CD401A680C012CB0A3B5F8DC08", "4463C531D7CCC1006794612BB656D3BF8257846F", "47AFB915CDA26D82467B97FA42914468726138DD", "4BA7B9DDD68788E12FF852E1A024204BF286A8F6", "4D8547B7F864132A7F62D9B75B068521F10B68E3", "4DF13947493CFF69CDE554881C5F114E97C3D03B", "4EF2E6670AC9B5091FE06BE0E5483EAAD6BA32D9", "4F65566336DB6598581D584A596C87934D5F2AB4", "51C3247D60F356C7CA3BAF4C3F429DAC93EE7B74", "53DECDF3BC1BDE7C9D1CEDAE718468CA20CC43E7", "587B59FB52D8A683CBE1CA00E6393D7BB923BC92", "5E997CA5945AAB75FFD14804A974BF2AE1DFE7E1", "637162CC59A3A1E25956FA5FA8F60D2E1C52EAC6", "6690C02B922CBD3FF0D0A5994DBD336592887E3F", "67EB337B684CEB0EC2B0760AB488278CDD9597DD", "687EC17E0602E3CD3F7DFBD7E28D57A0199A3F44", "688B6EB807E8EDA5C7B17C4393D0795F0FAE155F", "68ED18B309CD5291C0D3357C1D1141BF883866B1", "720FC15DDC27D456D098FABF3CDD78D31EF5A8DA", "7613BF0BA261006CAC3ED2DDBEF343425357F18B", "7A74410FB0CD5C972A364B71BF031D88A6510E9E", "7AC5FFF8DCBC5583176877073BF751735E9BD358", "7B02312BACC59EC388FEAE12FD277F6A9FB4FAC1", "7CA04FD8064C1CAA32A37AA94375038E8DF8DDC0", "7D7F4414CCEF168ADF6BF40753B5BECD78375931", "7F88CD7223F3C813818C994614A89C99FA3B5247", "838E30F77FDD14AA385ED145009C0E2236494FAA", "8977E8569D2A633AF01D0394851681CE122683A6", "8B24CD8D8B58C6DA72ACE097C7B1E3CEA4DC3DC6", "9078C5A28F9A4325C2A7C73813CDFE13C20F934E", "90DEDE9E4C4E9F6FD88617579DD391BC65A68964", "96974CD6B663A7184526B1D648AD815CF51E801A", "9845A431D51959CAF225322B4A4FE9F223CE6D15", "9BACF3B664EAC5A17BED08437C72E4ACDA12F7E7", "9FC796E8F8524F863AE1496D381242105F1B78F5", "A1505D9843C826DD67ED4EA5209804BDBB0DF502", "A399F76F0CBF4C9DA55E4AC24E8960984B2905B6", "A3E31E20B2E46A328520472D0CDE9523E7260C6D", "A5EC73D48C34FCBEF1005AEB85843524BBFAB727", "B19DD096DCD4E3E0FD676885505A672C438D4E9C", "B533345D06F64516403C00DA03187D3BFEF59156", "B6AF5BE5F878A00114C3D7FEF8C775C34CCD17B6", "B72FFF92D2CE43DE0A8D4C548C503726A81E2B93", "CFDEFE102FDA05BBE4C78D2E4423589005B2571D", "D29F6C98BEFC6D986521543EE8BE56CEBC288CF3", "DBAC3C7AA4254DA1AA5CAAD68468CB88EEDDEEA8", "E38A2B7663B86796436D8DF5898D9FAA6835B238", "EC0C3716EA9EDFADD35DFBD55608E60A05D3CBF3", "EF2DACCBEABB682D32CE4ABD6CB90025236C07BC", "F5A874F3987EB0A9961A564B669A9050F770308A", "F88015D3F98479E1DA553D24FD42BA3F43886AEF") #Recuperation des certificats dont: #l'objet PSParentPath ne contiens pas "Disallowed" #N'est pas dans la blacklist #N'est pas déja expiré #Expire dans $expireInDays jours $allCerts = Get-ChildItem -Path cert: -Recurse | where-object {$_.PSParentPath -notlike "*Disallowed" ` -and ($blacklist -notcontains $_.Thumbprint) ` -and $_.Notafter -gt (get-date) -and $_.Notafter -lt (get-date).AddDays($expireInDays) } | Select-Object -Property PSPath,Issuer,Subject,NotAfter if (@($allCerts | Measure-Object | Select-Object count -ExpandProperty count) -gt $NbThreshold) { write-host -ForegroundColor Yellow "WARNING" write-host -ForegroundColor Yellow "Nombre de certificat venant a expirer dans $expireInDays jours : "$allCerts.count" `n" #Formatage pour affichage et insertion dans l'eventlog [string]$resultat = $allCerts | foreach { $_.PsPath ; $_.Subject ; $_.Issuer ; $_.NotAfter ; "`n" ; "`n"} $resultat NewEventSource $count = $allCerts.count [string]$resultat = $allCerts | foreach { $_.PsPath ; $_.Subject ; $_.Issuer ; $_.NotAfter ; "`n" ; "`n"} Write-EventLog -LogName Application -Source $Scriptname -EntryType Warning -EventId 1001 -Message "WARNING - Nombre de certificat venant a expirer dans $expireInDays jours : $count `n`n ; $resultat " } Else { write-host -ForegroundColor Green "OK" write-host "Nombre de certificat venant a expirer dans $expireInDays jours inferieur ou egal a $NbThreshold" NewEventSource Write-EventLog -LogName Application -Source $Scriptname -EntryType Information -EventId 1000 -Message "OK - Nombre de certificat venant a expirer dans $expireInDays jours inferieur ou egal a $NbThreshold" }