10
votes

Signédexml CheckSignature retourne false

J'ai regardé d'autres messages ici concernant ce problème et aucun d'entre eux ne semble aborder ma situation.

J'essaie de vérifier une affirmation SAML pour la semaine dernière et j'ai 2 clients qui ont envoyé Moi Saml mais je ne peux pas le vérifier.

Le processus principal est que nous obtenons une affirmation codée de base64 et je le décode. Chargez-le dans un xmldocment avec préserverwhitepace = true.

La méthode de vérification est xxx

J'ai le certificat du client que j'ai lu depuis Web. CONFIG (STI STOCTÉS STOCKED COMME BASE64 Encoded String) XMLElement est l'élément signé, SignéXML est un objet SignDexML créé avec NOUVEAU SNDXML (xmlelement)

Les deux clients sont renvoyés par checksignature, mais lorsque je crée ma propre signature saml avec mon certificat, il retournera vrai.

Qu'est-ce que je manque ici?

EDIT: Oui Les deux clients sont sur Java et j'ai posté la méthode SetsigningkeyFromkeyFoFo


6 commentaires

Laissez-moi deviner, l'affirmation que vous recevez a été générée dans une langue non -.net, telle que Java?


Qu'est-ce que setsigningkeyfromkeyinfo (ScrigneXML); faire?


Lorsque vous avez la base64Decodé l'affirmation, pouvez-vous jeter le XML dans un fichier et le comparer à l'une de vos propres affirmations pour vérifier les incohérences structurelles (subtiles)?


Voir mon édition. En ce qui concerne la comparaison des 2 affirmations Oui. J'ai regardé les deux affirmations et je ne peux pas trouver quoi que ce soit qui me tient debout.


Vous voudrez peut-être vérifier cette implémentation: digitaliser.dk/resource/ 558794 / artefact / OIOSAML-DOT-NET-1.6. ZIP C'est une implémentation open source du protocole SAML dans .NET que j'ai participé écrit il y a quelques années. Je n'ai pas vérifié la version actuelle, mais vous devriez pouvoir m'inspirer de là.


J'ai eu une expérience vaguement similaire avec le cryptage qui s'est avéré être des codages différents utilisés (UTF-8 VS UTF-16). Un problème similaire pourrait-il se produire ici? Je suis à peu près sûr que le codage par défaut est UTF-8 pour Java et UTF-16 pour .NET.


4 Réponses :


9
votes

J'ai traité avec beaucoup de XML signé dans le passé. Tout ce que je peux dire, c'est que c'était un cauchemar. Fondamentalement, lorsque vous signez XML, cela passe par un processus appelé canonicalisation (C14N). Il doit transformer le texte XML sur un flux d'octets pouvant être signé. La manipulation de WhitSpace & NAMESSPACE, entre autres, les normes XML C14N sont difficiles à comprendre, encore plus difficiles à appliquer correctement. Il existe même plusieurs types de C14N.

La mise en œuvre .NET est très sélective sur ce qu'elle accepte. Il est tout à fait possible que votre autre mise en œuvre ne fonctionne pas exactement de la même manière que la .NET. C'est très triste en effet. Si vous pouvez éliminer les espaces bleus et les espaces de noms de votre source XML avant de vous inscrire, par exemple, cela pourrait aider. Aussi, si vous pouviez vous assurer que les deux implémentations utilisent les mêmes paramètres C14n.

Sinon, beaucoup de débogage vous attend. Vous pouvez déboguer dans le cadre ou appeler ses méthodes internes à la main avec réflexion, pour voir comment cela calcule le fragment XML et la signature. Et faire la même chose avec l'autre mise en œuvre. Fondamentalement, vous devez voir les flux d'octets exacts signés dans les deux cas. C'est la dernière étape de la conversion avant de la signature. Si ces ruisseaux d'octets correspondent, vous n'aurez aucun problème avec la pièce de signature de RSA de mon expérience. Si ceux-ci ne correspondent pas, comme dans votre cas, au moins, vous verrez où le problème est.


0 commentaires

4
votes

J'avais juste un problème similaire et j'ai perdu beaucoup de temps, peut-être que cela peut aider quelqu'un.

Mon environnement est 100% .NET 4.5, et mon code utilise uniquement la classe SignDexML. Mais une affirmation SAML a été acceptée au même endroit et a refusé à un autre.

s'est avéré que un endroit chargait l'affirmation via une instance XMLDocument initialisée avec préserverwhitepace = true , tandis que l'autre n'était pas.

Et l'affirmation avait été jolie-imprimée, elle avait donc des retours de transport et de nombreux espaces d'indentation. Suppression de tous les retours de chariot et les espaces d'indentation fixèrent mon problème.


1 commentaires

La valeur par défaut pour xmldocument.presvevewhitepace est false. Est passé à true et a été capable de récupérer un «vrai» de la checksignature. Je suppose que le blancheur a été utilisé lors du calcul de la signature avec le certificat, et lorsqu'il est dépouillé, la signature n'était pas vue comme valide.



1
votes

eu un problème similaire avec Saml comme Timores. Le SAML devait être décodé à partir de base64 mais j'ai d'abord utilisé:

var saml = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(samlToken))


0 commentaires

0
votes

J'ai passé beaucoup de temps sur cette question, puis j'ai compris que je ne vérifie pas la signature avec le bon certificat.

J'ai donc décidé de vérifier le certificat que je reçois dans le fichier de réponse XML de Azure: xxx

alors: xxx

btest la valeur a été définitivement défini sur true.


0 commentaires