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

maa*_*ali 2 java amazon-web-services xml-parsing saml-2.0 amazon-elastic-beanstalk

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

javax.xml.crypto.URIReferenceException:  
com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Cannot 
resolve element with ID SAML-
Run Code Online (Sandbox Code Playgroud)

经查,Java 1.7 u25 版本后有bug。参考如下

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);
                   .....
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。

Tor*_*Tor 5

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

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));
}
Run Code Online (Sandbox Code Playgroud)

就在验证之前。不过,可能有一个更优雅的解决方案。