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



i具有以下代码,该代码将content.xml导入document.xml并签名document.xml root元素。

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:

我看到了一条线,在一个名为createSignature的示例中设置了前缀" ds",该示例为java的apache santuario库。

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

在图书馆开发人员撰写的书中,他指定了如何定义签名,因为Xades4j主要是为了构建签名,而不是整个文档:

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

引用:Xades4J- Xades签名服务的Java库。LuísFilipedos santosgonçalves

通过"删除名称空间",我认为您的意思是删除前缀。这不是您可以通过Xades4J控制的,因为默认前缀是由Apache Santuario设置的,然后在创建XMLSignature时使用。默认值似乎是在Init类中设置的;我不确定如何/是否要覆盖设置。

尝试将其放入您的代码中:

Constants.setSignatureSpecNSprefix("");

请使用Java版本6.32或更高版本避免附加DS:在签名的XML

相关内容

  • 没有找到相关文章

最新更新