Validar assinatura digital de arquivo XML

Verificar a assinatura digital de um arquivo XML envolve basicamente a leitura do arquivo XML, o cálculo hash da mensagem e verificação da assinatura digital usando o certificado que em geral, está disponível na própria mensagem XML.

E o de código Java que nos permite fazer tudo isso:

    

public class VerificaAssinatura {

public static void main(String[] args) throws Exception {

    InputStream in = new FileInputStream(new File("C://xmlAssinado.xml"));

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    org.w3c.dom.Document doc = dbf.newDocumentBuilder().parse(in);

    NodeList xmlAssinatura = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
    if (xmlAssinatura.getLength() == 0) {
      throw new Exception("Elemento Signature não encontrado");
    }
    DOMStructure dse = new DOMStructure(xmlAssinatura.item(0));    
    XMLSignatureFactory factory = XMLSignatureFactory.getInstance("DOM");
    XMLSignature signature = factory.unmarshalXMLSignature(dse);

    PublicKey publicKey = null;
    List list = signature.getKeyInfo().getContent();
    for (int i = 0; i < list.size(); i++) { 	     
        XMLStructure xs = (XMLStructure) list.get(i); 	     
        if (xs instanceof X509Data) { 	       
          for (Object data : ((X509Data) xs).getContent()) { 	         
           if (data instanceof java.security.cert.X509Certificate) { 
      	     publicKey =  ((java.security.cert.X509Certificate) data).getPublicKey();     
           } 	        
          } 	      
        }
    } 	   

    DOMValidateContext valContext = new DOMValidateContext(publicKey, xmlAssinatura.item(0)); 	  
    XMLSignature xmlSignature =  factory.unmarshalXMLSignature(valContext);	

    System.out.println("|- coreValidity" + xmlSignature.validate(valContext));
    System.out.println("|- signature validation status:" + signature.getSignatureValue().validate(valContext));

    Iterator i = xmlSignature.getSignedInfo().getReferences().iterator();
    for (int j = 0; i.hasNext(); j++) { 
      Reference reference = ((Reference) i.next()); 
      boolean refValid = reference.validate(valContext);  
      System.out.println("ref[" + j + "] validity status: " + refValid);  
    }

    System.out.println("| Algoritmo assinatura: " + signature.getSignedInfo().getSignatureMethod().getAlgorithm());
    System.out.println("| Algoritmo do certificado: "  + publicKey.getAlgorithm());
  }
}

E os imports:

  import java.io.File;
  import java.io.FileInputStream;
  import java.io.InputStream;
  import java.security.PublicKey;
  import java.util.Iterator;
  import java.util.List;

  import javax.xml.crypto.XMLStructure;
  import javax.xml.crypto.dom.DOMStructure;
  import javax.xml.crypto.dsig.Reference;
  import javax.xml.crypto.dsig.XMLSignature;
  import javax.xml.crypto.dsig.XMLSignatureFactory;
  import javax.xml.crypto.dsig.dom.DOMValidateContext;
  import javax.xml.crypto.dsig.keyinfo.X509Data;
  import javax.xml.parsers.DocumentBuilderFactory;
  
  import org.w3c.dom.NodeList;
É necessário incluir a dependência para a classe 'NodeList' do pacote 'org.w3c.dom' que pode ser encontrado em http://www.jdom.org/

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s