【问题标题】:How to remove namespace from then signature elements in Xades4J signature?如何从 Xades4J 签名中的签名元素中删除命名空间?
【发布时间】:2016-11-23 08:06:00
【问题描述】:

我有以下代码,将 content.xml 导入到 document.xml 并签署 document.xml 根元素。

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:

【问题讨论】:

    标签: java x509certificate xades4j


    【解决方案1】:

    “删除命名空间”我认为您的意思是删除前缀。这不是您可以通过 xades4j 控制的东西,因为默认前缀是 set by Apache Santuario,然后在 creating a XMLSignature 时使用。默认值似乎是set on the Init class;我不确定如何/是否覆盖这些设置。

    【讨论】:

      【解决方案2】:

      我看到在名为CreateSignature 的示例中为Java 中的Apache Santuario 库设置了前缀“ds”。

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

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

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

      引用自:XAdES4j — XAdES 签名服务的 Java 库。作者:Luís Filipe dos Santos Gonçalves

      【讨论】:

        【解决方案3】:

        尝试放入你的代码:

        Constants.setSignatureSpecNSprefix("");
        

        【讨论】:

          【解决方案4】:

          请使用 java 6.32 或更高版本以避免在签名的 XML 中附加 ds:

          【讨论】:

            猜你喜欢
            • 2011-01-06
            • 1970-01-01
            • 2019-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-29
            相关资源
            最近更新 更多