style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Dos Transformaciones en una firma digital(Enveloped Signature Transform, XPath Transform)

Hola, tengo un problema a la hora de realizar una firma digital para un webservices, me pide que tenga una transformación Enveloped-Signature y después la transformación Xpath.

he logrado hacer la primera, pero transformarlo a Xpath no lo he podido hacer.

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

 
/*EN ESTA  PARTE SE HACE LA TRANSFORMACION ENVELOPED*/
       
        Reference ref = fac.newReference
            ("", fac.newDigestMethod(DigestMethod.SHA1, null),
             Collections.singletonList
              (fac.newTransform
                (Transform.ENVELOPED, (TransformParameterSpec) null)),
             null, null);

       
        SignedInfo si = fac.newSignedInfo
            (fac.newCanonicalizationMethod
             (CanonicalizationMethod.INCLUSIVE,
              (C14NMethodParameterSpec) null),
             fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
             Collections.singletonList(ref));

¿me puede ayudar a decirme como se puede hacer la segunda firma?

De antemano gracias por su ayuda...

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de rhdtp

Código

Hola, estoy realizando el método para realizar la firma digital de un xml con las características que mencionas. Es para la OPE cierto?

public String generarFirmaDigital(Document docXML, PrivateKey privateKey, X509Certificate x509C, String XPathFilter) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, IOException, KeyException, TransformerException {

        // Creamos XML Signature Factory

        XMLSignatureFactory xmlSigFactory = XMLSignatureFactory.getInstance("DOM");
        DOMSignContext domSignCtx = new DOMSignContext(privateKey, docXML.getDocumentElement());
        Reference ref = null;
        SignedInfo signedInfo = null;

        // Transformadores

        List<Transform> transforms = new ArrayList<Transform>();
        transforms.add(xmlSigFactory.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null));
        transforms.add(xmlSigFactory.newTransform(Transform.XPATH, new XPathFilterParameterSpec("ancestor-or-self::*[local-name()='" + XPathFilter + "']")));

        try {

            ref = xmlSigFactory.newReference("", xmlSigFactory.newDigestMethod(DigestMethod.SHA1, null), transforms, null, null);
            signedInfo = xmlSigFactory.newSignedInfo(xmlSigFactory.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null), xmlSigFactory.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(ref));

        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        } catch (InvalidAlgorithmParameterException ex) {
            ex.printStackTrace();
        }

        // Pasamos la llave publica (.cer)

        KeyInfoFactory kif = xmlSigFactory.getKeyInfoFactory();
        List<X509Certificate> x509Content = new ArrayList<X509Certificate>();
        x509Content.add(x509C);
        X509Data xd = kif.newX509Data(x509Content);
        KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));

        // Creamos un nuevo XML Signature

        XMLSignature xmlSignature = xmlSigFactory.newXMLSignature(signedInfo, ki);

        // Firmamos el documento

        try {          
            xmlSignature.sign(domSignCtx);
        } catch (MarshalException ex) {
            ex.printStackTrace();
        } catch (XMLSignatureException ex) {
            ex.printStackTrace();
        }

        // Grabamos el documento firmado

        return UtilXML.docToString(docXML);
    }

Esa es la parte que llevo pero estoy teniendo un problema después de firmar el xml ya que modifica todas las tags del xml. Al parecer el detalle es con el transformador de XPath ya que si lo omito el xml se genera bien al parecer, pero falta ese transformador. Agradecería mucho tu ayuda si has logrado resolver esto. Saludos.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">