javax.xml.crypto.URIReferenceException:无法解析ID为SAML的元素 -

时间:2014-03-05 11:13:15

标签: java amazon-web-services xml-parsing elastic-beanstalk saml-2.0

我正在尝试使用Java解析SAML响应。我得到一个异常

javax.xml.crypto.URIReferenceException:  
com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Cannot 
resolve element with ID SAML-

经过调查,在1.7 u25版本之后Java中存在错误。参考文献如下

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7094155

有人能指出我如何纠正这个错误,因为我正在使用AWS Beanstalk(它仅支持1.7 u 25,而且只支持Linux。)

以下是阅读SAML和解析的起始代码,实际上我需要验证SAML以及签名。

  ByteArrayInputStream bis = new ByteArrayInputStream(resp.getBytes());
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    documentBuilderFactory.setNamespaceAware(true);
            DocumentBuilder docBuilder;


    try {
        docBuilder = documentBuilderFactory.newDocumentBuilder();      
        Document doc = docBuilder.parse(bis);
        Node nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS,"Signature").item(0);
                   .....

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

我认为你遇到了这个问题;

https://bugs.openjdk.java.net/browse/JDK-8017169

我通过做类似

的方式解决saml响应问题
NodeList elList = this.document.getElementsByTagName("saml:Assertion");
if (elList != null && elList.getLength() > 0) {
    Attr id = ((Element)elList.item(0)).getAttributeNode("ID");
    IdResolver.registerElementById((Element)elList.item(0), id);
    log.debug("registered id: " + id + " for element: " + (Element)elList.item(0));
}

在验证之前。可能有更优雅的解决方案。

答案 1 :(得分:1)

我使用JDK的XPath 1.0实现来处理SAML响应,这段代码对我有用:

Element signature = (Element) xp.evaluate("//dsig:Signature", root, XPathConstants.NODE);
DOMValidateContext ctx = new DOMValidateContext(_cert.getPublicKey(), signature);            
NodeList idAttributes = (NodeList) xp.evaluate("//*[@ID]", root, XPathConstants.NODESET);
for (int i = 0; i < idAttributes.getLength(); i++) {
    ctx.setIdAttributeNS((Element) idAttributes.item(i), null, "ID");
}
XMLSignatureFactory sigF = XMLSignatureFactory.getInstance("DOM");
XMLSignature xmlSignature = sigF.unmarshalXMLSignature(ctx);

if (xmlSignature.validate(ctx)) {
...