xml – 使用OpenSAML和OpenSSO的签名验证问题
发布时间:2020-12-16 23:27:38 所属栏目:百科 来源:网络整理
导读:我们在服务提供商网站上使用OpenSAML为我们的客户提供SSO.我们的客户(ID提供商)正在使用OpenSSO. OpenSSO发布的SAML响应在签名元素方面略有不同,因为它不受命名空间限定.这似乎与OpenSAML并不顺利,它从中返回null samlResponse.getSignature()方法,由于我无
我们在服务提供商网站上使用OpenSAML为我们的客户提供SSO.我们的客户(ID提供商)正在使用OpenSSO. OpenSSO发布的SAML响应在签名元素方面略有不同,因为它不受命名空间限定.这似乎与OpenSAML并不顺利,它从中返回null
samlResponse.getSignature()方法,由于我无法验证签名. 导致问题的SamlReponse的签名片段 <Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> <Reference URI="#s2d10cccbd58d1f78c2c76c74c82a236548c929ffd"> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>j+KBoDOtEcyCquPTxRCXoBulStQ=</DigestValue> </Reference> </SignedInfo> <SignatureValue>Dv+owuZfGFymGGrw2gHA3/7GVC6mXt8JMW+tOvmtnjTRJZaDE+Nb2NCngio1Tnqu4LWnvVrry4Wk... 6QcIJi/kGc4YFMSQj/Q=</SignatureValue> <KeyInfo> <X509Data> <X509Certificate>MIIEhDCCA+2gAwIBAgIQXxhipi2wpPxWi7MTVfFVHDANBgkqhkiG9w0BAQUFADCBujEfMB0GA1UE... 78Q/lRQuBhHMy02lKctnwjBeEYA=</X509Certificate> </X509Data> </KeyInfo> </Signature> 来自另一个可用的SAML响应的签名片段 <dsig:Signature xmlns="http://www.w3.org/2000/09/xmldsig#" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"> <dsig:SignedInfo> <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> <dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> <dsig:Reference URI="#id-TtLltjcBSOAJ6OipumUEj8o0Qag-"> <dsig:Transforms> <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> <dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </dsig:Transforms> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <dsig:DigestValue>5c95zhA139qzMvZA2A445F3LWaU=</dsig:DigestValue> </dsig:Reference> </dsig:SignedInfo> <dsig:SignatureValue>JsmRFJn1CjClHs4rf0hrwKzOq6ZtmnOEm/PNiaJvYurko/ZP+PApWhk55x0unIVwZ6XDv3k8Dj81WqUl07J0Dkvzp71bccIgiGTRzoNPT71nBAXxJmZiXz51JWctg13zjxP0oQMSpWytKCrFkCkJ0So3RQl3WixYV3miK0YjJnM=</dsig:SignatureValue> <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> </ds:KeyInfo> </dsig:Signature> 如您所见,OpenSSO服务器中的签名片段不包含SAML绑定规范中指定的命名空间限定符. 对我来说,最后一个选项是对发布的SAMLResponse进行一些按摩,以便将命名空间添加到签名元素中,以使OpenSAML库工作. 关于如何使用OpenSAML库解决这个问题的任何想法都受到高度赞赏. 提前致谢 解决方法
您可能可以执行一些DOM操作来修复XML.例如,这里是我必须编写的一些代码,用于修复客户端SAML Response XML中的一些命名空间属性(实际上,命名空间是在Response元素中定义的,但需要提取Assertion并保留名称空间).
Element assertionElem = assertion.getDOM(); if (!assertionElem.hasAttribute("xmlns:saml")) { assertionElem.setAttribute("xmlns:saml","urn:oasis:names:tc:SAML:2.0:assertion"); } if (!assertionElem.hasAttribute("xmlns:ds")) { assertionElem.setAttribute("xmlns:ds","http://www.w3.org/2000/09/xmldsig#"); } String assertionXml = Serializer.serializeXml(assertionElem,true,true); 您可以将xmlns =“http://www.w3.org/2000/09/xmldsig#”属性添加到Signature,然后将setDOM()添加到更新.问题是,samlResponse.getSignature().getDOM()是否会为您提供XML,或者您是否必须获取整个响应的DOM并从中提取Signature元素. 当然,实际上,客户端不应该向您发送不正确的命名空间XML,但我们知道这是怎么回事. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |