如何从Xades4J签名中的签名元素中删除名称空间?

问题描述:

我有以下代码,它将content.xml导入到document.xml中并签署document.xml根元素。如何从Xades4J签名中的签名元素中删除名称空间?

try { 
      KeyingDataProvider kp = new FileSystemKeyStoreKeyingDataProvider(
        "pkcs12", 
        "C:\\workspace\\tests\\my\\LG.pfx", 
        new FirstCertificateSelector(), 
        new DirectPasswordProvider("mykeypass"), 
        new DirectPasswordProvider("mykeypass"), 
        true); 
      XadesSigningProfile p = new XadesBesSigningProfile(kp); 
      XadesSigner signer = p.newSigner(); 

      javax.xml.parsers.DocumentBuilderFactory factory = javax.xml.parsers.DocumentBuilderFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      javax.xml.parsers.DocumentBuilder builder = null; 
      builder = factory.newDocumentBuilder(); 


      Document doc1 = builder.parse(new File("C:\\workspace\\tests\\document.xml")); 
      Document doc2 = builder.parse(new File("C:\\workspace\\tests\\content.xml")); 

      Node contentElement = doc2.getDocumentElement(); 
      Node parentElement = doc1.getDocumentElement(); 
      Node adoptedContentElement = doc1.adoptNode(contentElement); 
      parentElement.appendChild(adoptedContentElement); 

      Node nodeToSign = doc1.getDocumentElement().getFirstChild(); 
      Node nodeToAttachSignature = doc1.getDocumentElement(); 

      IndividualDataObjsTimeStampProperty dataObjsTimeStamp = new IndividualDataObjsTimeStampProperty(); 
      AllDataObjsCommitmentTypeProperty globalCommitment = AllDataObjsCommitmentTypeProperty.proofOfApproval(); 
      CommitmentTypeProperty commitment = CommitmentTypeProperty.proofOfCreation(); 

      DataObjectDesc obj = new EnvelopedXmlObject(nodeToSign, "text/xml", null); 
      SignedDataObjects dataObjs = new SignedDataObjects(obj).withCommitmentType(globalCommitment); 

      signer.sign(dataObjs, nodeToAttachSignature); 

      Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
      Result output = new StreamResult(new File("C:\\workspace\\tests\\signedDocument.xml")); 
      Source input = new DOMSource(doc1); 
      transformer.transform(input, output); 


     } catch (KeyStoreException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (XadesProfileResolutionException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ParserConfigurationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (SAXException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (TransformerConfigurationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (TransformerFactoryConfigurationError e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (TransformerException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (XAdES4jException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

产生像签名:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="xmldsig-26102a68-cfea-43fd-a40e-9682ae7da4a1"> 
<ds:SignedInfo> 
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> 

的问题是 - 如何从标志性元素删除命名空间ds:

“删除命名空间”我认为你的意思是删除前缀。这不是通过xades4j控制的,因为默认的前缀是set by Apache Santuario,然后在creating a XMLSignature时使用。默认值似乎为set on the Init class;我不知道如何/如果重写设置。

我看到其中前缀“DS”在名为CreateSignature一个例子设置,在Java Apache的圣所图书馆一行。

ElementProxy.setDefaultPrefix(Constants.SignatureSpecNS, "ds"); 

在由库的开发者写的书,他指定了如何定义签名,因为XAdES4j主要是建立签名,而不是整个文件:

5.2签名制作:如前所述,签名可以被看作具有两个部分:第一部分由签名者和签名操作本身的特征组成;第二, 资源正在签署。如果签名者被看作是生产者的常规签名 ,则当签名被创建时,他可能具有使用 的一组特征,即签名简档。这些 特征在签名之间是固定的,而签署的 资源有所不同。因此,生成签名是为了创建最终的XML结构而组合一个配置文件 和一组资源。 这个过程归结为三个主要任务:收集所需信息 (签名和数据对象的属性,算法,密钥 数据)在适当的顺序; 使用 Apache XML安全API创建核心签名结构;并创建要附加到签名的合格属性DOM 树。 请注意,Apache XML安全性 为核心签名结构创建了DOM树。然而, XAdES的元素是未知到Apache API,这意味着 最后一个任务必须由图书馆完全支持。

引用自:XAdES4j - 用于XAdES签名服务的Java库。路易斯·菲利佩·多斯桑托斯贡萨尔维斯

尝试把你的代码:

Constants.setSignatureSpecNSprefix(""); 

请使用Java版本6.32或以上,以避免追加DS:在签署XML