demoiselle / signer

Repositório que contém os componentes para facilitar a implementação de assinatura digital nos padrões da ICP-BRASIL
https://www.frameworkdemoiselle.gov.br/v3/signer/
GNU Lesser General Public License v3.0
142 stars 73 forks source link

conteudo do PDF assinado fica corrompido #390

Closed jradesenv closed 11 months ago

jradesenv commented 11 months ago

Pessoal, estou tentando utilizar a lib da seguinte forma na esperança de assinar meu PDF e mante-lo legivel, mas o arquivo pós assinatura apesar de passar com sucesso na validacao do ITI, ao abrir ele vejo que o conteudo ficou todo errado, cheio de espaços em branco e perdeu boa parte do conteudo original.
Estou correto em esperar que esse metodo doAttachedSign retorne o pdf assinado ainda legivel ou é esperado que ele fique inutil aos olhos do usuário e apenas valido para validacao do ITI?

implementation group: 'org.demoiselle.signer', name: 'policy-impl-cades', version: '3.7.1'.  

implementation group: 'org.demoiselle.signer', name: 'chain-icp-brasil', version: '3.7.1'

byte[] content = Base64.getDecoder().decode(input.getBase64());
// Salvar o PDF assinado em um arquivo
String caminhoArquivo1 = "cert/nao_assinado.pdf";
salvarPDFAssinado(content, caminhoArquivo1);

PKCS7Signer signer = PKCS7Factory.getInstance().factoryDefault();
aplicarCertificado(signer);

byte[] assinado = signer.doAttachedSign(content);

// Salvar o PDF assinado em um arquivo
String caminhoArquivo = "cert/assinado.pdf";
salvarPDFAssinado(assinado, caminhoArquivo);

Nesse teste do print abaixo mesmo o pdf resultante ficou completamente em branco:

image

E ainda assim valido no ITI:

image
esaito commented 11 months ago

Olá

O método que está usando faz a assinatura do tipo Attached (https://docs.oracle.com/cd/E19398-01/820-1228/gfnmj/index.html), serve para qualquer tipo de arquivo. Portanto esse método não gera um PDF assinado. Para fazer isso você precisa manipular o PDF usando uma lib como o PDFBox por exemplo ( https://github.com/demoiselle/signer/blob/master/policy-impl-pades/src/test/java/org/demoiselle/signer/policy/impl/pades/pkcs7/impl/PDFSignerTest.java) Ou poderia utilizar a integração com o Assinador SERPRO: https://www.assinadorserpro.estaleiro.serpro.gov.br/minimalista/tutorial/

jradesenv commented 11 months ago

Olá

O método que está usando faz a assinatura do tipo Attached (https://docs.oracle.com/cd/E19398-01/820-1228/gfnmj/index.html), serve para qualquer tipo de arquivo. Portanto esse método não gera um PDF assinado. Para fazer isso você precisa manipular o PDF usando uma lib como o PDFBox por exemplo ( https://github.com/demoiselle/signer/blob/master/policy-impl-pades/src/test/java/org/demoiselle/signer/policy/impl/pades/pkcs7/impl/PDFSignerTest.java) Ou poderia utilizar a integração com o Assinador SERPRO: https://www.assinadorserpro.estaleiro.serpro.gov.br/minimalista/tutorial/

de fato eu acho que a proposta da lib então nao era a de assinar o documento pdf como eu esperava mas sim a de gerar apenas a assinatura, certo? eu acabei resolvendo de outra forma manipulando o proprio pdf como voce falou, mas nao tinha visto o exemplo PDFSignerTest. Vou ver se melhoro minha solução com base nele.

Obrigado

esaito commented 11 months ago

Exato, a assinatura gerada por aquele método embute o PDF dentro dela. Como está resolvido vou fechar a Issue.