viernes, 11 de octubre de 2013

Validar firma xml utilizando certificado x509 y libreria xmlsec-1.4.3.jar

package xml;

import java.io.File;  
import java.security.PublicKey;  
import java.security.cert.X509Certificate;  
import org.apache.xml.security.keys.KeyInfo;  
import org.apache.xml.security.signature.XMLSignature;  
import org.w3c.dom.*;  
  
import javax.xml.parsers.*;  
  
/** 
 * Verifica un archivo firmado 
 * @author Jorge Salomon
 * @see http://linSlackware.blogspot.com 
 */  
public class VerifySignature {  
      
    /** 
     * Punto de inicio 
     */  
    public static void main(String args[]) throws Exception {  
        org.apache.xml.security.Init.init();  
  
        String signatureFileName = "/home/slack/desarrollo/testing/src/xml/xml/DTE_DOWN76828160-2 387.xml";  
  
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
  
        dbf.setNamespaceAware(true);  
        dbf.setAttribute("http://xml.org/sax/features/namespaces", Boolean.TRUE);  
          
        File            f   = new File(signatureFileName);  
        DocumentBuilder db  = dbf.newDocumentBuilder();  
        Document     doc    = db.parse(new java.io.FileInputStream(f));  
        Element      sigElement = (Element) doc.getElementsByTagName("Signature").item(0);  
        XMLSignature signature  = new XMLSignature(sigElement, f.toURL().toString());  
  
        KeyInfo keyInfo = signature.getKeyInfo();  
        if (keyInfo != null) {  
            X509Certificate cert = keyInfo.getX509Certificate();  
            if (cert != null) {  
                // Validamos la firma usando un certificado X509  
                if (signature.checkSignatureValue(cert)){  
                    System.out.println("Válido según el certificado");    
                } else {  
                    System.out.println("Inválido según el certificado");      
                }  
            } else {  
                // No encontramos un Certificado intentamos validar por la cláve pública  
                PublicKey pk = keyInfo.getPublicKey();  
                if (pk != null) {  
                    // Validamos usando la clave pública  
                    if (signature.checkSignatureValue(pk)){  
                        System.out.println("Válido según la clave pública");      
                    } else {  
                        System.out.println("Inválido según la clave pública");    
                    }  
                } else {  
                    System.out.println("No podemos validar, tampoco hay clave pública");  
                }  
            }  
        } else {  
            System.out.println("No ha sido posible encontrar el KeyInfo");  
        }  
    }  
  
}

No hay comentarios: