Usando token de e-CPF no GNU Linux para assinaturas digitais e serviços diversos

Igor Machado
6 min readMar 9, 2021

--

Com a digitalização dos processos brasileiros, se torna cada vez mais útil (e às vezes necessário) a obtenção de um CPF digital, chamado de e-CPF. O e-CPF tem propriedades criptográficas, permitindo dentre outras coisas, efetuar assinaturas digitais. Devido ao não-repúdio, uma vez assinado um documento com o e-CPF, essa assinatura é reconhecida legalmente no país como pertencente ao CPF correspondente.

O e-CPF é distribuído de duas formas: através de certificados A1 armazenados no próprio computador; e certificados A3 armazenados em mídias criptográficas como tokens (parecidos com um pendrive). Nesse artigo, discutimos o uso de tokens para e-CPF no Linux, para uso no portal web gov.br e para assinaturas digitais em PDF.

No mercado brasileiro, diversas empresas oferecem o serviço de autoridade certificadora (AC) para e-CPF, enquanto o token pode ser de diversos fabricantes. Se sua AC fornecer suporte a Linux, ótimo! Basta seguir as instruções, mas geralmente não é o caso… Então, abordaremos a configuração de tokens de duas grandes marcas, a StarSign e Safenet, com foco em sistemas GNU Linux baseados em Debian/Ubuntu.

Tokens StarSign e Safenet (Fonte: certificadora AC Digital)

Após a obtenção de um token, caso não saiba o modelo, pode utilizar o comando lsusb para descobrir. O token Safenet 5110 aparece como Aladdin, enquanto o StarSign aparece como G&D.

$ lsusb
Aladdin Knowledge Systems Token JC
Giesecke & Devrient GmbH

Para descobrir o modelo exato, pode ser útil instalar o pacote debian opensc, e utilizar o comando opensc-tool -n. Nesse caso, é possível visualizar o código 5110 para o Safenet e G&D para o StarSign. Curiosamente, ambos aparecem como Unsupported card (isso é normal!).

$ sudo apt install opensc

Em ambos os casos, é necessário instalar algum tipo de gerenciador para o token. Dividimos o tutorial em duas partes, para StarSign e Safenet.

Token StarSign

Conferindo o modelo no opensc:

$ opensc-tool -n
Using reader with a card: Giesecke & Devrient GmbH StarSign CUT S [.] (03200312006166) 00 00
Unsupported card

O token StarSign necessita da instalação do gerenciador Tokenadmin, bem como a biblioteca OpenSSL. O site da AC Digital fornece um arquivo Safesign_3.5.2_1804_x86_64.deb para instalação do tokenadmin (para Ubuntu 18.04). A biblioteca libssl pode ser encontrada no pacote libssl1.0.0 dos repositórios debian.

Gerenciador Tokenadmin da StarSign

Token Safenet

Conferindo o modelo no opensc:

$ opensc-tool -n
Using reader with a card: AKS ifdh [eToken 5110 SC] 00 00
Unsupported card

O token da Safenet necessita da instalação do gerenciador SafeNet Authentication Client (SAC). O site da AC Digital fornece um pacote SafenetAuthenticationClient-9.1.7–0_amd64.deb para instalação, dentro de um arquivo compactado debian.rar.

Para interagir com o token, basta abrir a interface do aplicativo SACTools:

SafeNet Authentication Client Tools

Pronto! Com o gerenciador aberto no sistema, você já pode usar para assinar documentos no Firefox, ou com algum assinador digital (como o Assinador do SERPRO).

Integração do token com o Firefox

Para acessar o token em páginas web, é necessária a integração com o navegador, no caso, Mozilla Firefox. É preciso que existam os arquivos .so no so sistema.

No caso do Safenet, procure por libeTPkcs11.so e libeToken.so no seu Linux (em /usr/lib ou /lib ou /usr/lib64 …). O comando locate pode ser útil também para apontar o caminho:

$ locate libeToken.so
/lib/libeToken.so.10
/lib/libeToken.so.10.0
/lib/libeToken.so.10.0.37
/usr/lib/libeToken.so
/usr/lib/libeToken.so.10

No caso do SafeSign, procure por libaetpkss.so.3.0.2528 (a numeração pode variar). O comando ls dentro de /usr/lib pode ajudar:

ls -lh /usr/lib/libaetpkss*

Após encontrar o arquivo .so correspondente ao seu token, vá para o Firefox. No Firefox, vá em Preferences -> Privacy & Security -> Security Devices, e adicione o libeToken.so com o Load.

Firefox Security Devices adicionando token

Reinicie o Firefox e faça o teste abaixo.

Portal gov.br (testando o token)

Teste em https://contas.acesso.gov.br, clicando no link Cerificado Digital o Firefox deve abrir um pop-up solicitando a senha de desbloqueio do token.

Caso o login seja bem-sucedido, você ganhará o selo ouro de conta comprovada (na aba Privacidade do portal gov.br).

Lista de confiabilidades do gov.br inclui a conta comprovada via certificado digital

Utilizando o token com ReceitaNet e ColetaNacional

Outros serviços da Receita Federal podem exigir e-CPF, como o ColetaNacional. No caso, o serviço é distribuído no formato Java WebStart com extensão .jnlp, o que também traz certa dificuldade de uso em ambientes linux. Então, deixamos também algumas instruções para configuração do WebStart no linux, utilizando JRE da Oracle versão 8 (não pode ser OpenJDK ou OpenWebStart).

sudo mkdir /opt/jre
cd /opt/jre
# Faça download do JRE 8 (não do SDK!) para Linux64 (.tar.gz) em: https://java.com/en/download/
sudo tar -zxvf jre-8u281-linux-x64.tar.gz
sudo update-alternatives --install /usr/bin/java java /opt/jre/jre1.8.0_281/bin/java 100
sudo update-alternatives --install /usr/bin/javaws javaws /opt/jre/jre1.8.0_281/bin/javaws 100
sudo update-alternatives --config java
# Escolha opção /opt/jre/jre1.8.0_281/bin/java
sudo update-alternatives --config javaws
# Escolha opção /opt/jre/jre1.8.0_281/bin/javaws

====== testando versão java ======
java -version
# java version "1.8.0_281"
javaws
# Java(TM) Web Start 11.281.2.09-fcs

Pronto, basta abrir o ColetaNacional, baixar o arquivo ColetaNac-desktop.jnlp e conectar o token para envio de dados à Receita Federal.

====== invocando .jnlp ===========
javaws ~/Downloads/ColetaNac-desktop.jnlp

Assinatura de Documentos do Conselho Federal de Medicina (CFM)

O uso de e-CPF também permite que médicos assinem digitalmente receitas eletrônicas. Veja mais em https://prescricaoeletronica.cfm.org.br

Em um post anterior, foi discutido o uso do software livre Okular para assinaturas digitais com certificados do ICPEdu. Porém, o Okular aparentemente não oferece suporte para tokens para assinatura em PDF, portanto recomendamos a instalação do Assinador do SERPRO para Windows/Mac/Linux. Ele tem suporte completo em linux, tanto para assinaturas digitais e verificação de assinaturas em pdf, bem como carimbos de tempo e demais serviços do ICP Brasil.

Menu do assinador digital do SERPRO

Basta abrir a aplicação do assinador, escolher o arquivo PDF e a posição desejada para colocação da assinatura (a senha do token será solicitada para finalização do processo de assinatura).

Assinando PDF usando o Assinador Serpro e token e-CPF

Uma observação importante é que o software assinador pode lançar o seguinte erro:

PDF contains an encryption dictionary, please remove it with setAllSecurityToBeRemoved() or set a protection policy with protect()

Nesse caso, por alguma razão, o PDF vem com algum tipo de bloqueio que atrapalha o processo de assinatura (algum conflito entre tecnologias permissionadas de PDF e recursos não padronizados). Isso pode ser corrigido utilizando o site gratuito freemypdf.com, que diz claramente que o serviço só deve ser utilizado para fins lícitos. Vários tipos de proteção em PDF não são tão protetivas assim (muitas vezes bugs), enquanto outras realmente visam proteção legítima (por exemplo, contra leitura) e o site não quebra nenhum tipo de senha de proteção desse tipo.

Outra opção para resolver o problema localmente no Linux é reescrever o documento usando ghostscript (mas nesse caso, campos de edição também são perdidos, diferente do que faz o freemypdf que preserva os campos de alguma maneira):

gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=%stdout% -c .setpdfwrite -f arquivo-travado.pdf > arquivo-destravado.pdf

Após o comando acima, será possível assinar o PDF normalmente (requer instalação do ghostscript localmente).

--

--

Responses (1)