2012-05-21 4 views
7

Este es mi código para generar la firma xml:XML firma es invalidada por la adición de un C14N exclusiva transformar

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

Esto da una validación de referencia como falso y también la validez del núcleo como falso. Pero cuando quito envTrasnform es decir variables fac.new Transform("http://www.w3.org/2001/10/xml-exc-c14n#",transformSpec) y ejecutar el siguiente código:

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

Esto le da a la validez del núcleo y la validez de referencia como verdadero. Por qué está pasando esto. Obtuve este código desde el enlace this (fragmento de código 2 en la creación de la sección de firma envolvente).

Respuesta

6

En realidad, la transformación c14n se debe realizar después de la transformación de firma envolvente. Se debe canonicalizar después de extraer el documento que se va a firmar (el documento también contiene actualmente el elemento de firma, por lo que debe separarse antes de canonicalizar la parte real que se va a firmar). La orden debe ser así:

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