2013-04-30 10 views
5

Próbuję podpisać plik XML za pomocą podpisów kopertowych i klas javax.xml.crypto.dsig. *. W rezultacie otrzymuję plik z poprawną zawartością podpisu, ale bez zdefiniowanej przestrzeni nazw. Jak mogę dodać obszar nazw xmlns: ds = "http://www.w3.org/2000/09/xmldsig#" i odpowiadające mu prefiksy ds? Nie widzę żadnego miejsca, w którym mógłbym je zdefiniować.Jak dodać przestrzeń nazw podczas podpisywania pliku XML za pomocą pliku javax.xml.crypto.dsig. *?

Przykładowy kod:

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

    (...) 

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

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

daje przykład 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> 

ale chcę:

<?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> 
+0

Wynikowy kod XML jest poprawny. Dlaczego chcesz ten prefiks na ? Tak, jest uważany za "dobrze znany" prefiks, ale nie powinno to wpływać na poprawność wynikowego XML. – user568826

Odpowiedz

3

Poniżej znajduje się przykładowy kod z Oracle do generowania otoczoną podpis. I domyślam się, czego szukasz: dsc.setDefaultNamespacePrefix ("dsig"); jak pokazano w przykładzie poniżej.

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

Algorytm ciągu znaków = XMLSignature.ALGO_ID_SIGNATURE_RSA; XMLSignature sig = new XMLSignature(doc, algoritmo);

-1

Jeśli chcesz mieć swój podpisany XML w formacie poniżej

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

Potem łaskawie używać Java 6 w wersji 31 ​​i będzie wymagana podpisany XML.

Powiązane problemy