2012-05-21 19 views
7

To jest mój kod do generowania podpisu XML:XML podpis jest unieważnione na dodanie c14n wyłączną przekształcić

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

Daje to sprawdzanie odniesienia jako fałszywą, a także rdzeń ważność jako fałszywe. Ale kiedy usunąć envTrasnform zmienny tj fac.new Transform("http://www.w3.org/2001/10/xml-exc-c14n#",transformSpec) i wykonać z następującego kodu:

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

Daje ważności rdzenia i zasadność odniesienia jako prawdziwe. Dlaczego to się dzieje. Dostałem ten kod z linku this (fragment kodu 2 w tworzeniu sekcji podpisu kopertowego).

Odpowiedz

6

W rzeczywistości transformacja c14n powinna zostać przeprowadzona po transformacji podpisu kopertowego. Powinna być zsynchronizowana po wyodrębnieniu dokumentu, który ma zostać podpisany (dokument ten zawiera również element podpisu, dlatego należy go oddzielić przed kanonizacją faktycznej części, która ma zostać podpisana). Zamówienie powinno być następujące:

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