2012-05-21 6 views
7

Das ist mein Code ist XML-Signatur zu generieren:XML-Signatur wird auf das Hinzufügen einer C14N exklusiv für ungültig erklärt verwandeln

DOMSignContext dsc = new DOMSignContext 
    (prk, xmldoc.getDocumentElement()); 

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

    DigestMethod digestMethod = 
     fac.newDigestMethod("http://www.w3.org/2000/09/xmldsig#sha1", null); 
    C14NMethodParameterSpec spec = null; 
    CanonicalizationMethod cm = fac.newCanonicalizationMethod(
     "http://www.w3.org/2001/10/xml-exc-c14n#",spec); 
    SignatureMethod sm = fac.newSignatureMethod( 
     "http://www.w3.org/2000/09/xmldsig#rsa-sha1",null); 
    ArrayList transformList = new ArrayList(); 
    TransformParameterSpec transformSpec = null; 
    Transform envTransform = fac.newTransform("http://www.w3.org/2000/09/xmldsig#enveloped-signature",transformSpec); 
    Transform exc14nTransform = fac.newTransform(
     "http://www.w3.org/2001/10/xml-exc-c14n#",transformSpec); 
transformList.add(exc14nTransform); 
transformList.add(envTransform); 

Reference ref = fac.newReference("",digestMethod,transformList,null,null); 
ArrayList refList = new ArrayList(); 
refList.add(ref); 
SignedInfo si =fac.newSignedInfo(cm,sm,refList); 

Dies ergibt eine Referenzvalidierung als falsch und auch als falsche Kern Gültigkeit. Aber wenn ich entferne envTrasnform Variable d.h fac.new Transform("http://www.w3.org/2001/10/xml-exc-c14n#",transformSpec) und führen Sie mit dem folgenden Code:

DOMSignContext dsc = new DOMSignContext 
    (prk, xmldoc.getDocumentElement()); 

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

    DigestMethod digestMethod = 
     fac.newDigestMethod("http://www.w3.org/2000/09/xmldsig#sha1", null); 
    C14NMethodParameterSpec spec = null; 
    CanonicalizationMethod cm = fac.newCanonicalizationMethod(
     "http://www.w3.org/2001/10/xml-exc-c14n#",spec); 
    SignatureMethod sm = fac.newSignatureMethod( 
     "http://www.w3.org/2000/09/xmldsig#rsa-sha1",null); 
    ArrayList transformList = new ArrayList(); 
    TransformParameterSpec transformSpec = null; 
    Transform envTransform = fac.newTransform(
     "http://www.w3.org/2000/09/xmldsig#enveloped-signature",transformSpec); 
transformList.add(envTransform); 
Reference ref = fac.newReference("",digestMethod,transformList,null,null); 
ArrayList refList = new ArrayList(); 
refList.add(ref); 
SignedInfo si =fac.newSignedInfo(cm,sm,refList); 

Dies gibt die Kern Gültigkeit und die Referenz Gültigkeit als wahr. Warum passiert dies. Ich habe diesen Code Formular this Link (Codefragment 2 bei der Erstellung von umhüllten Unterschrift Abschnitt).

Antwort

6

Eigentlich sollte die c14n-Transformation nach der umhüllten Signaturtransformation durchgeführt werden. Es sollte nach dem Extrahieren des zu signierenden Dokuments kanonisiert werden (das Dokument enthält derzeit auch das Signaturelement. Es muss daher getrennt werden, bevor der eigentliche zu signierende Teil kanonisiert wird). Die Bestellung sollte so sein:

transformList.add(envTransform); 
transformList.add(exc14nTransform);