当前位置: 首页 > 知识库问答 >
问题:

如何在使用javax.xml.crypto.dsig.*对XML文件进行签名时添加命名空间?

秦博达
2023-03-14

我尝试使用封装签名和javax.xml.crypto.dsig对xml文件进行签名。*班级。结果,我得到了具有正确签名内容但未定义名称空间的文件。如何添加xmlns:ds=”http://www.w3.org/2000/09/xmldsig#“名称空间和相应的ds前缀?我看不到任何地方可以定义它。

示例代码:

    XMLSignatureFactory xmlSignatureFactory = XMLSignatureFactory.getInstance("DOM");

    (...)

    XMLSignature signature = xmlSignatureFactory.newXMLSignature(signedInfo, keyInfo);

    // Marshal, generate, and sign the enveloped signature.
    signature.sign(domSignContext);

给出了示例 XML:

<?xml version="1.0" encoding="UTF-8"?>
<test xmlns="http://different.namespace.com">
    <someBody/>
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <SignedInfo>
            <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
            <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>     
            <Reference URI="">
                <Transforms>
                    <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                </Transforms>
                <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                <DigestValue>base64_digest</DigestValue>
            </Reference>
        </SignedInfo>
        <SignatureValue>some_base64</SignatureValue>
        <KeyInfo>
            <X509Data> 
                <X509SubjectName>subject_data</X509SubjectName>
                <X509Certificate>some_more_base64</X509Certificate>
            </X509Data>
            <KeyValue>
                <RSAKeyValue>
                    <Modulus>another_base64</Modulus>
                    <Exponent>base64_as_well</Exponent>
                </RSAKeyValue>
            </KeyValue>
        </KeyInfo>
   </Signature>
</test>

但我想:

<?xml version="1.0" encoding="UTF-8"?>
<test xmlns="http://different.namespace.com" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <someBody/>
    <ds:Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
            <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>     
            <ds:Reference URI="">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                <ds:DigestValue>base64_digest</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>some_base64</ds:SignatureValue>
        <ds:KeyInfo>
            <ds:X509Data> 
                <ds:X509SubjectName>subject_data</ds:X509SubjectName>
                <ds:X509Certificate>some_more_base64</ds:X509Certificate>
            </ds:X509Data>
            <ds:KeyValue>
                <ds:RSAKeyValue>
                    <ds:Modulus>another_base64</ds:Modulus>
                    <ds:Exponent>base64_as_well</ds:Exponent>
                </ds:RSAKeyValue>
            </ds:KeyValue>
        </ds:KeyInfo>
   </ds:Signature>
</test>

共有3个答案

何德寿
2023-03-14

如果您希望将签名的XML转换为以下格式:

<ds:Signature ...> ... </ds:Signature>

然后请使用Java6版本31,您将获得所需的签名XML。

淳于俊迈
2023-03-14

字符串算法= XMLSignature。ALGO _身份证_签名_ RSA< code > XML signature SIG = new XML signature(doc,algoritmo);

顾赞
2023-03-14

下面是来自 Oracle 的示例代码,用于生成包络签名。我猜你要找的是dsc.setDefaultNamespacePrefix(“dsig”);如下面的示例所示。

    XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");

    Reference ref = fac.newReference
    ("", fac.newDigestMethod(DigestMethod.SHA1, null),
            Collections.singletonList
            (fac.newTransform
                    (Transform.ENVELOPED, (TransformParameterSpec) null)),
                    null, null);

    // Create the SignedInfo
    SignedInfo si = fac.newSignedInfo
    (fac.newCanonicalizationMethod
            (CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS,
                    (C14NMethodParameterSpec) null),
                    fac.newSignatureMethod(SignatureMethod.DSA_SHA1, null),
                    Collections.singletonList(ref));

    // Create a DSA KeyPair
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA");
    kpg.initialize(512);
    KeyPair kp = kpg.generateKeyPair();

    // Create a KeyValue containing the DSA PublicKey that was generated
    KeyInfoFactory kif = fac.getKeyInfoFactory();
    KeyValue kv = kif.newKeyValue(kp.getPublic());

    // Create a KeyInfo and add the KeyValue to it
    KeyInfo ki = kif.newKeyInfo(Collections.singletonList(kv));

    // Instantiate the document to be signed
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    Document doc =  dbf.newDocumentBuilder().parse(new FileInputStream(sourceFile));

    // Create a DOMSignContext and specify the DSA PrivateKey and
    // location of the resulting XMLSignature's parent element
    DOMSignContext dsc = new DOMSignContext(kp.getPrivate(), doc.getDocumentElement());
    dsc.setDefaultNamespacePrefix("dsig");

    // Create the XMLSignature (but don't sign it yet)
    XMLSignature signature = fac.newXMLSignature(si, ki);

    // Marshal, generate (and sign) the enveloped signature
    signature.sign(dsc);

    // output the resulting document
    OutputStream os;
    os = new FileOutputStream(DestinationFile);

    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer trans = tf.newTransformer();
    trans.transform(new DOMSource(doc), new StreamResult(os));
 类似资料:
  • 我正在生成一个XML Xades签名。我需要在标记签名中添加名称空间http://uri.etsi.org/01903/v1.3.2#。 如果我在对文档签名后添加此标记,我将得到无效签名错误。 我需要命名空间将在标记签名中而不是标记对象中

  • 我们正在创建一个可以支持XML和JSON格式的Spring boot REST服务。我们使用这里描述的相同方法:接受/返回XML/JSON请求和响应- Spring MVC 除了我们需要在XML响应中有一个名称空间之外,它大部分都是有效的,目前响应XML没有任何名称空间。我们尝试在DTO类中添加以下内容,并尝试创建“package info.java”。两者都不起作用。有人有什么建议吗? @jav

  • 有没有办法使用openssl对x509证书或任何文档进行数字签名?

  • 我在理解OpenSSL的签名和验证过程时遇到了一些困难。 我有一个小型证书层次结构:根证书=>子证书=>结束实体证书。我想拥有来自最终实体CA的代码签名证书,因此创建了一个密钥对并请求CSR: 非常感谢。

  • 我需要使用RSA-SHA1算法对XML文档的一个节点进行签名(并最终验证)。W3.org链接 RSA-SHA1 URI: http://www.w3.org/2000/09/XMLDSIG#RSA-SHA1 指定于: [XMLDSIG-CORE2002]第6.4.2节 签名生成发生在以下位置: 唯一带有参数的重写需要: (链接) 在.NET中用RSA-SHA1签署XML最轻松的方式是什么? 编辑:

  • 我有一个包含EC私钥的文件: 我有一个证书,它的公钥对应于私钥: 在 pem 格式中: 以txt格式: 我正在努力完成两件事: < li >使用ecdsa-with-SHA256签名算法使用私钥对字节数组进行签名 < li >使用证书中的公钥验证签名是否正确 我尝试过使用充气城堡图书馆。这是我到目前为止所拥有的。我的断言是失败的。