【问题标题】:javax.xml.crypto.URIReferenceException: Cannot resolve element with ID SAML-javax.xml.crypto.URIReferenceException:无法解析 ID 为 SAML- 的元素
【发布时间】:2014-04-07 09:54:32
【问题描述】:

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

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

经查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);
                   .....

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案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)) {
    ...
    

    【讨论】:

      【解决方案2】:

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

      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));
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-19
        • 2018-05-30
        • 1970-01-01
        • 2020-06-20
        相关资源
        最近更新 更多