Assinatura Digital do ICPEdu em PDF no GNU Linux

Assinaturas de documentos oficiais, em formato digital, tipicamente demandam algum tipo de tecnologia criptográfica que garanta a autenticidade e não repúdio do assinante. No Brasil, a Infraestutura de Chaves Públicas para Ensino e Pesquisa (ICPEdu) oferecida pela Rede Nacional de Ensino e Pesquisa (RNP) atualmente provê um serviço emissão de certificados digitais. Os certificados emitidos tem foco em pessoal (com duração atual de 12 meses), sendo atrelados ao certificado AC Pessoas.

Emissão de certificados digitais pessoais em instituições acadêmicas: https://pessoal.icpedu.rnp.br/home

Geralmente, o suporte de assinaturas em documentos PDF no Windows é feito através do serviço proprietário da Adobe. O objetivo desse tutorial é demonstrar como assinar digitalmente documentos PDF no Linux, utilizando alternativas livres. Felizmente, a partir de Dez./2020 o processo ficou bastante simples, através do suporte a assinaturas digitais nos softwares livres Okular e backend Poppler (tarefa financiada pelo TU Desdren).

Neste tutorial, consideramos o sistema Ubuntu 20.04 e o sistema de pacotes Flatpak (que funciona também em outras distribuições GNU Linux). O suporte oficial de assinaturas digitais no Okular está previsto para Abr./2021, e após esse lançamento será possível instalar diretamente sem uso do Flatpak.

Primeiramente, instale o Flatpak no Ubuntu, caso não tenha feito: https://flatpak.org/setup/Ubuntu/

Os próximos três comandos adicionam os repositórios flathub e kdeapps no Flatpak, bem como instalam o Okular no Flatpak:

Instalando Okular via Flatpak

Finalmente, basta invocar o Okular através do Flatpak (não entra em conflito com possíveis outras versões do Okular instaladas no sistema):

O comando acima permite acesso do Okular ao sistema de arquivos (para acessar os certificados) e também à rede.

Okular 21.03.70 com suporte a assinaturas digitais

Para facilitar invocação no bash, pode criar um script de execução okular_flatpak.sh em /usr/bin:

Ok, e agora, como faço pra assinar um documento?

Para assinar algo digitalmente, você precisa primeiro de um certificado (par de chaves pública-privada). No caso do ICPEdu, você receberá um arquivo PKCS #12 (extensão .p12), que somente você deverá ter acesso. Além dessa chave, você recebe toda a cadeia de certificados, que inclui o AC Pessoas, que está logo abaixo do certificado AC Raiz.

Uma forma de exportar o arquivo .p12 para uso em outras aplicações (como o Okular), é usando o armazenamento de chaves do Mozilla Firefox usando NSS. Na versão 85.0.1 do Firefox, basta adicionar os certificados na seguinte tela: Preferences ->Privacy & Security->Certificates->View Certificates

Certificado .p12 adicionado ao Firefox
Certificados AC Pessoa e AC Raiz adicionados no Firefox

Note que a segurança do certificado é fundamental, então só faça isso em um computador seguro de uso estritamente pessoal. Caso contrário, será necessário mantê-lo em algum local seguro (como um pendrive), e somente utilizar quando for necessário. Os certificados do Firefox estarão armazenados na pasta local ~/.mozilla/firefox/xxxxxxx.default em uma base denominada cert8.db (ou cert9.db).

Finalmente, vamos abrir o Okular via Flatpak e carregar um arquivo de teste para assinar (vamos utilizar o arquivo 2021-Teste-Assinatura-Digital.pdf hospedado no meu GitHub).

Em Settings->Configure Backends você pode incluir o diretório do Firefox que contem os certificados:

Adicionando certificado p12 no Okular: Settings->Configure Backends->PDF->Custom

Pronto! Agora é só clicar em Tools->Digitally Sign para marcar uma caixinha e anexar a assinatura digital no lugar correto. Note que a assinatura vai parecer apenas um texto vermelho dizendo nome, email, cpf, e horário da assinatura (sem nenhuma “figura” da assinatura), mas é isso mesmo! O que garante a autenticidade da assinatura são metadados incluídos no PDF, portanto não imprima e não altere o PDF após uma assinatura, senão ela será completamente perdida (várias pessoas podem assinar digitalmente sucessivamente um mesmo documento sem perder as anteriores).

Caso queira usar tokens digitais (como e-CPF), veja o meu outro post no medium, que explica como configurar e usar no linux. Nesse caso, pode ser necessário o uso de assinadores digitais com suporte a tokens, como o Assinador do SERPRO para Windows/Mac/Linux. Nos meus testes o Firefox importa a chave corretamente do e-token, mas não exporta para o Okular (não sei o motivo).

Se alguém quiser praticar a verificação de assinaturas ICPEdu, deixei um exemplo no GitHub com minha própria assinatura (devido ao não-repúdio, não posso dizer que não fui eu…). Importante: caso percam acesso ao certificado, ou suspeitem de vazamento para terceiros, devem imediatamente informar ao órgão emissor para que seja emitido um certificado de revogação (que tecnicamente invalida futuras assinaturas no certificado antigo).

Espero que seja útil, até uma próxima!

Igor Machado Coelho é professor no Instituto de Computação da Universidade Federal Fluminense (desde 2020).

Este tutorial só foi possível graças aos seguintes posts: