FrameworkDemoiselle.gov.brCommunity Documentation

Capítulo 11. Funcionalidades

11.1. Assinatura Enveloped
11.2. Geração de Assinatura XML do tipo Detached
11.3. Validação de assinatura XML - Enveloped
11.4. Validação de assinatura para XML Detached
11.5. Tratando os resultados da valiação
11.6.

Este componente provê mecanismos de assinatura digital baseado nas normas ICP-Brasil e implementa mecanismos de assinatura digital no formato XML

O padrão xades define o formato para assinatura. E a ICP-Brasil define um conjunto próprio de informações básicas para as assinaturas digitais chamado PBAD

A interface org.demoiselle.signer.policy.impl.xades.xml.Signer provê as funcionalidades de Assinatura.

Para as funções de VALIDAÇÃO temos a interface org.demoiselle.signer.policy.impl.xades.xml.Checker

Este componente, até a presente versão, permite assinar no formato Enveloped (A Assinatura passa ser parte do documento) e Detached Envloped (Assinatura Desanexada).

Para Assinar em XML Enveloped, a entrada deve ser um arquivo em formato XML.

A seguir temos um fragmento de código que demonstra a utilização do componente nesta funcionalidade



            Keystore ks = getKeyStoreTokenBySigner();
            File newFile = new File("caminho para o arquivo");
            String alias = getAlias(ks);
            XMLSigner xmlSigner = new XMLSigner();
            // para A3
            xmlSigner.setPrivateKey((PrivateKey) ks.getKey(alias, null));
            // para A1
            // quando certificado em arquivo, precisa informar a senha
            // char[] senha = "senha".toCharArray();
            // xmlSigner.setPrivateKey((PrivateKey) ks.getKey(alias, senha));
            xmlSigner.setCertificateChain(ks.getCertificateChain(alias));
            // o par�mentro true � para diferenciar do m�todo que recebe uma String contendo um XML
            Document doc = xmlSigner.signEnveloped(true, newFile.getPath());
 

A seguir temos um fragmento de código que demonstra a utilização do componente com informação da política de assinatura. Neste caso podemos escolher uma das políticas (em vigor) que já acompanham o componente e referem-se à Assinatura Digital padrão XAdES.



            Keystore ks = getKeyStoreTokenBySigner();
            File newFile = new File("caminho para o arquivo");
            String alias = getAlias(ks);
            XMLSigner xmlSigner = new XMLSigner();
            // para A3
            xmlSigner.setPrivateKey((PrivateKey) ks.getKey(alias, null));
            // para A1
            // quando certificado em arquivo, precisa informar a senha
            // char[] senha = "senha".toCharArray();
            // xmlSigner.setPrivateKey((PrivateKey) ks.getKey(alias, senha));
            xmlSigner.setCertificateChain(ks.getCertificateChain(alias));
            // para mudar a politica de Assinatura
            xmlSigner.setPolicyId(XMLPoliciesOID.AD_RT_XADES_2_4.getOID());
            // indicando o local do arquivo XML
            Document doc = xmlSigner.signEnveloped(true, newFile.getPath());

Podemos gerar uma assinatura em formato XML para qualquer tipo de Arquivo. Da mesmo forma que o padrão CAdES gera um arquivo separado (.p7s), neste caso teremos um arquivo no formato xml desanexado do contéudo assinado.

Abaixo um trecho de código exemplo:



            KeyStore ks =  getKeyStoreTokenBySigner();
            File newFile = new File("caminho para o arquivo");
            String alias = getAlias(ks);
            XMLSigner xmlSigner = new XMLSigner();
            // para A3
            xmlSigner.setPrivateKey((PrivateKey) ks.getKey(alias, null));
            // para A1
            // quando certificado em arquivo, precisa informar a senha
            // char[] senha = "senha".toCharArray();
            // xmlSigner.setPrivateKey((PrivateKey) ks.getKey(alias, senha));
            xmlSigner.setCertificateChain(ks.getCertificateChain(alias));
            Document doc = xmlSigner.signDetachedEnveloped(newFile.getPath());

A validação de uma Assinatura em XML consiste em enviar ao componente o arquivo XML que contém a Assinatura.

A seguir temos um fragmento de código que demonstra a utilização do componente nesta funcionalidade



            File newFile = new File("caminho para o arquivo");
            XMLChecker xadesChecker = new XMLChecker();
            xadesChecker.check(true, newFile.getPath());
            List<XMLSignatureInformations> results = new ArrayList<XMLSignatureInformations>();
            results = xadesChecker.getSignaturesInfo();

O retorno é um objeto do tipo org.demoiselle.signer.policy.impl.xades.XMLSignatureInformations que possui os seguintes atributos



public class SignatureInformations {
    private LinkedList<X509Certificate> chain; // cadeia do certificado que gerou a assinatura 
    private Date signDate;  // data do equipamento no momento da gera��o das assinatura (n�o tem validade legal)
    private Timestamp timeStampSigner = null; // Carimbo de tempo da assinatura, quando a politica utilizada permitir
    private XMLSignaturePolicy signaturePolicy; // Politica ICP-BRASIL usada para gera��o da assinatura
    private Date notAfter; // data de vencimento do certificado que produziu a assinatura
    private LinkedList<String> validatorWarnins = new LinkedList<String>(); // Lista de avisos que por ventura possam ter sido encontrados na valida��o da assinatura
    private LinkedList<String> validatorErrors = new LinkedList<String>();  // Lista de erros que por ventura possam ter sido encontrados na valida��o da assinatura
    private boolean invalidSignature = false; // Se a assinatura � v�lida
    private BasicCertificate icpBrasilcertificate = null; // Class que representa o certificado no padr�o ICP-Brasil que produziu a Assinatura
    
    

Na validação de uma assinatura XML Detached, temos além do arquivo .xml que contém a Assinautra temos outro arquivo com o conteúdo assinado. A seguir temos um fragmento de código que demonstra esta validação.



            File newFile = new File("caminho at� o cont�udo assinado);
            File newSignatureFile = new File("caminho at� o XML com a Assinatura");
            XMLChecker xadesChecker = new XMLChecker();
            xadesChecker.check(newFile.getPath(), newSignatureFile.getPath());

Como é possível que um mesmo arquivo possa contar várias assinaturas, só será gerada exceção quando a assinatura ou o arquivo estiverem comprometidos Nos demais casos, o Demoiselle-Signer irá devolver o resultado numa lista de objetos XMLSignatureInformations. Essa classe contém os seguintes atributos:

Cabe ao sistema com base nos avisos ou erros, aceitar ou não a Assinatura. Apesar de existirem as políticas, qualquer tipo de Assinatura gerada com um certificado ICP-Brasil tem validade legal. A seguir temos um fragmento de código que demonstra esta validação.



        List<XMLSignatureInformations> results = new ArrayList<XMLSignatureInformations>();
        results = xadesChecker.getSignaturesInfo();
        if (!results.isEmpty()) {
                for (XMLSignatureInformations sis : results) {
                    for (String valErr : sis.getValidatorErrors()) {
                        System.err.println("++++++++++++++ ERROS ++++++++++++++++++");
                        System.err.println(valErr);
                    }
                    for (String valWarn : sis.getValidatorWarnins()) {
                        System.err.println("++++++++++++++ AVISOS ++++++++++++++++++");
                        System.err.println(valWarn);
                    }
                    if (sis.getSignaturePolicy() != null) {
                        System.out.println("------ Politica ----------------- ");
                        System.out.println(sis.getSignaturePolicy().toString());
                    }
                    BasicCertificate bc = sis.getIcpBrasilcertificate();
                    System.out.println(bc.toString());
                    if (bc.hasCertificatePF()) {
                        System.out.println(bc.getICPBRCertificatePF().getCPF());
                    }
                    if (bc.hasCertificatePJ()) {
                        System.out.println(bc.getICPBRCertificatePJ().getCNPJ());
                        System.out.println(bc.getICPBRCertificatePJ().getResponsibleCPF());
                    }
                    if (sis.getTimeStampSigner() != null) {
                        System.out.println(sis.getTimeStampSigner().toString());
                    }
                }
            }