FrameworkDemoiselle.gov.brCommunity Documentation
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.
Como entrada pode ser informado
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.
AD_RB_XADES_2_4
Refere-se à Assinatura Digital de Referência Básica versão 2.4;
AD_RT_XADES_2_4
Refere-se à Assinatura Digital de Referência Temporal (com carimbo de tempo) versão 2.4;
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());
Caso não seja especificada nenhuma política, o componente assumirá a política padrão AD_RB_XADES_2_4.
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.
Como entrada pode ser informado
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:
chain;
Lista X509Certificate com a cadeia completa do certificado do Assinante
signDate
A data do equipamento onde foi gerada a assinatura, e serve apenas como referência, não tem nenhuma validade legal
timeStampSigner
É o carimbo do Tempo (Timestamp) incluído na Assinatura, é a prova legal da data e hora que a Assinatura foi gerada.
signaturePolicy;
A política (SignaturePolicy) que foi usada para gerar a Assinatura
notAfter;
A data de validade do Certificado do Assinante
validatorWarnins
Lista de Avisos. A assinatura pode estar correta mas não foi possível verificar algum atributo exigido por uma política da ICP-Brasil, que serão listados aqui
validatorErrors
Lista de Erros. A assinatura pode estar correta mas não foi possível verificar alguma condição de validação exigida pela ICP-Brasil
invalidSignature
valor booleano, que indica que Assinatura não está válida
icpBrasilcertificate
BasicCertificate do Assinante
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());
}
}
}