Question

Au travail, nous avons une application web que nous aurons besoin de l'interface avec l'application web d'une autre société utilisant Single Sign On validé par SAML. Nos applications web sont écrits en PHP, et il est évidemment hors de propos que le choix de langue l'autre société utilise. Quoi qu'il en soit, j'ai besoin d'écrire une API simple que cette autre société peut envoyer des requêtes SOAP à des demandes SAML, et générer une réponse en retour SAML. J'ai écrit à partir de zéro pour trois raisons: 1) il ne semble pas vraiment être beaucoup d'options pour les interactions SAML écrites en PHP, même si je voulais un, 2) elle limite les frais généraux qui participeraient à l'ajout d'un autre composant tiers, et 3) créer des choses à partir de zéro me laisse généralement avec une bien meilleure compréhension et me rend beaucoup plus capable d'adapter la chose à l'avenir si nécessaire.

Quoi qu'il en soit, je suis assez nouveau pour SAML, SOAP et standards XML en général, donc je l'ai été moi-même genre de l'enseignement comme je vais. J'ai l'API à peu près complète pour nos besoins, à une exception près que l'autre société a précisé que notre réponse sera nécessaire pour être signé numériquement avec un certificat (et la demande que nous recevons sera de la même signature numérique). J'ai donc essayé de comprendre comment traiter / générer les signatures XML, mais honnêtement, il est tout un peu confus que les spécifications du W3C ne sont pas exactement la lecture lumière.

Section 5.4.8 du

Était-ce utile?

La solution

est pas vraiment trop difficile signatures XML de traitement, si vous êtes très familier avec XML, mais il y a beaucoup de détails qui doivent être tout à fait raison ou les choses ne fonctionnent pas, donc je ne serais probablement pas essayer d'écrire mon propre la mise en œuvre dans cette situation (je ne le mettre en œuvre en partie une fois, mais c'était dans un but différent et spécial, et de toute façon ce ne fut pas une mise en œuvre complète).

Quoi qu'il en soit, je ne sais pas grand chose sur SAML, mais je ne sais XML et XML signatures, alors peut-être que je peux vous un bout de chemin en essayant de répondre à vos questions.

Un élément Signature fait référence à un morceau spécifique d'un document XML qui a été signé numériquement, dans son élément enfant SignedInfo. L'élément enfant Reference de ce (je pense qu'il peut y avoir de nombreux éléments Reference qui obtiennent concaténés lors de la formation des octets à signer, mais je ne me souviens pas sûr plus) pointe vers le contenu par l'attribut URI. Les éléments de Transform décrivent les transformations effectuées sur la visée à contenu avant le hachant; vous devrez regarder les spécifications de comprendre comment les algorithmes de transformation sont définis. L'élément DigestMethod donne l'algorithme de hachage pour appliquer les octets qui sont le résultat de ces algorithmes de transformation (notez que l'un d'entre eux est toujours canonicalisation qui convertit XML en octets), et le DigestValue donne le résultat de cet algorithme digérer.

La signature réelle est dans l'élément de SignatureValue, et est produit en appliquant la forme canonique de l'élément de CanonicalizationMethod pour produire les octets et la signature de ces octets avec le SignatureMethod. L'élément KeyInfo vous indique comment trouver la clé à utiliser.

Canonicalisation, qui apparaît plusieurs fois ci-dessus, est tout simplement un moyen de convertir un document XML en octets afin que les documents XML « équivalents » produisent la même séquence d'octets. Cela est nécessaire dans une signature numérique parce que les algorithmes fonctionnent sur des octets et XML peut passer à travers un certain nombre d'intermédiaires qui va probablement perturber les octets d'origine, mais conservent l'équivalence. Et les différentes méthodes de canonicalisation sont nécessaires pour différentes situations: si les éléments sont extraits de documents et placés dans d'autres, vous avez besoin canonicalisation exclusif que les bandes loin définitions d'espace de noms inutiles, mais dans d'autres cas qui pourraient ne pas fonctionner correctement, vous devez donc canonicalisation y compris la place, qui préserve tous les espaces de noms dans le champ de.

Ceci est juste l'essentiel. Il y a un certain nombre d'options différentes dans la façon de produire une signature XML, et si vous souhaitez mettre en œuvre un vérificateur de travail, vous devez considérer tous. Puisque vous êtes nouveau XML en général, je vais répéter mon conseil d'utiliser quelque chose qui existe déjà. C'est une expérience d'apprentissage intéressant de mettre en œuvre un cahier des charges, mais souvent il est une perte de temps si les mises en œuvre sont déjà disponibles.

Il est documentation sur les signatures.

Autres conseils

Il y a un exemple dans xmlseclibs.php SimpleSAML . Elle repose sur le module OpenSSL pour faire le Crypto.

Je honnêtement utiliser que lib ou pont java / tomcat, juste parce que les questions Interop pourraient venir qui devront éventuellement être débogué,

  1. Vous pouvez jeter un oeil sur cette lib Java pour signer la demande SAML exemple https: // github.com/jrowny/java-saml

  2. Pour valider la signature, vous devez installer addon traceur SAML https://addons.mozilla.org/en-US/firefox/addon/saml-tracer/

  3. Vous pouvez utiliser l'outil https://www.samltool.com/validate_logout_req.php pour vaalidate ou signer la demande https://www.samltool.com/sign_logout_req.php

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top