[DICA] Como extrair o conteúdo de um arquivo criptografado com extensão P7S

Iniciado por Sampayu, 08 de Fevereiro de 2020, 08:26

tópico anterior - próximo tópico

Sampayu



INTRODUÇÃO
Recentemente comprei (via Internet) uma certidão digital num cartório e o arquivo da certidão veio assim: certidao.pdf.p7s  :o Essa extensão dupla (.pdf.p7s) indica que se trata de um arquivo no formato PDF que em seguida foi "empacotado" para um arquivo-pacote no formato P7S. Tentei abrir esse arquivo P7S com diferentes aplicativos visualizadores de arquivos PDF, mas nenhum deles foi capaz de ler esse arquivo PDF com extensão P7S. E na Internet eu também não encontrei nenhum visualizador online para esse tipo de arquivo.

Essa extensão P7S é pouco conhecida, mas imagine o seguinte: digamos que você pegue um arquivo PDF e o "empacote" como um arquivo TAR (ou ZIP, se preferir). Embora esse arquivo-pacote não requeira uma senha para ser aberto, o "empacotamento" que você aplicou fará com que esse arquivo PDF "empacotado" se torne ilegível para aplicativos visualizadores de arquivos PDF, não é mesmo? Por exemplo: se você tentar abrir um tal de arquivo.pdf.tar ou arquivo.pdf.zip com um visualizador de arquivos PDF, o visualizador retornará um erro.

Pois é, um arquivo P7S é essencialmente isso: ele é um arquivo (não necessariamente PDF...) que foi criptografado ("empacotado" para um formato criptográfico) e, por causa disso, o aplicativo visualizador do arquivo em sua forma original (como por exemplo um visualizador de arquivos PDF) não conseguirá mais ler o código-fonte desse arquivo e exibir para você as informações dele, justamente devido à aplicação dessa criptografia que deixou o arquivo PDF com formato P7S.

O que ocorre é que existe um formato de assinatura eletrônica – denominado CAdES¹ – que é largamente aceito pelo mercado por ser um formato capaz de assinar digitalmente qualquer tipo de arquivo: DOC, ODT, DOCX, XLS, TXT, PPT, OTT etc. – inclusive arquivos PDF. No entanto, esse padrão de assinatura produz um arquivo de extensão P7S que não é nem um pouco fácil de se conseguir visualizar.

A razão por que não é fácil visualizar arquivos P7S é que um visualizador desses teria de ser um aplicativo capaz de não apenas descriptografar (interpretar e descodificar) o conteúdo do arquivo P7S, mas também teria de ser capaz de mostrar o conteúdo do arquivo P7S descriptografado. O problema é que esse arquivo descriptografado pode ser um arquivo PDF, um arquivo TXT, um DOC, um ODS, um XLS, um PPT, um arquivo de imagem JPG etc., portanto o visualizador teria de ser capaz não apenas de ler o código P7S e descriptografá-lo, mas ainda por cima mostrar para você o conteúdo do arquivo independentemente do formato original dele (PDF, TXT, DOC, ODS, XLS, PPT, JPG etc.). Percebe a complexidade disso? Se já é necessário um programa específico para abrir arquivos DOC e DOCX, outro programa específico para abrir arquivos PDF, outro para arquivos XLS etc., imagine um programa capaz de abrir e exibir o conteúdo de todos eles!

É por isso que geralmente as pessoas "desempacotam" o arquivo P7S e então abrem o arquivo "desempacotado" no aplicativo visualizador específico. Se você desempacotar o arquivo P7S e o resultado for um arquivo ODS, por exemplo, você abre esse ODS no LibreOffice Calc; se o resultado for um arquivo PDF, você abre o PDF num visualizador de arquivos PDF; e assim por diante.

Apesar de ser difícil um visualizador "universal" para arquivos P7S, existe um modo relativamente simples de conseguir "extrair" o conteúdo do arquivo P7S: basta instalar o pacote openssl e utilizá-lo, no terminal do shell do Linux, para executar um comando que criará um arquivo-clone do arquivo P7S, em seguida lerá o conteúdo criptografado desse arquivo-clone, descriptografará esse conteúdo do arquivo-clone e então salvará esse arquivo-clone (para que ele se torne um arquivo legível, visualizável). O resultado será então o seu arquivo P7S original intacto e, além disso, um arquivo-clone que conterá o conteúdo descriptografado e fácil de visualizar.



EXTRAINDO O CONTEÚDO DO ARQUIVO P7S
Meu sistema Linux (XUbuntu 16.04 de 64 bits) já estava com o openssl instalado, mas se esse não for o seu caso basta abrir uma janela do terminal do shell (a combinação de teclas Ctrl Alt T normalmente faz isso) e então executar no terminal este comando de instalação do openssl:
sudo apt-get install openssl -y

Uma vez que o pacote openssl esteja instalado, use o comando cd para acessar a pasta em que o arquivo P7S se encontra. A título de exemplo, suponha que o arquivo certidao.pdf.p7s esteja em /tmp e eu queira descriptografar o conteúdo dele para um arquivo certidao.pdf que também quero que fique na pasta /tmp. Em tal caso, primeiro eu entro na pasta com este comando:
cd /tmp

...e em seguida executo este comando para criar o arquivo descriptografado certidao.pdf a partir do original certidao.pdf.p7s:
openssl smime -inform DER -verify -noverify -in certidao.pdf.p7s -out certidao.pdf

O resultado será então o arquivo certidao.pdf, que você poderá abrir com qualquer visualizador de arquivos PDF.  8)

Caso (por exemplo) o arquivo original seja um DOC ao invés de PDF, como por exemplo arquivo.doc.p7s, execute o comando assim:
openssl smime -inform DER -verify -noverify -in arquivo.doc.p7s -out arquivo.doc

Se o arquivo não tiver a extensão original dele, como por exemplo arquivo.p7s, e além disso você não souber qual é o formato original do arquivo, execute o comando assim:
openssl smime -inform DER -verify -noverify -in arquivo.p7s -out arquivo

...e depois tente abrir o arquivo simplesmente clicando duas vezes sobre ele (ou clicando uma vez e pressionando a tecla Enter). O Linux é inteligente o bastante para ler o cabeçalho do código-fonte do arquivo, identificar o formato dele e selecionar o visualizador adequado (caso seu sistema possua). Mas se você fizer isso e não funcionar, tente abrir arquivo com diferentes visualizadores, como por exemplo visualizador (e/ou editor) de arquivos PDF, visualizador (e/ou editor) de arquivos DOC, DOCX, ODT, XLS, XLSX, PPT etc.

Ainda no terminal, este comando:
cat arquivo | grep -i pdf

...retornará a mensagem "Arquivo binário (entrada padrão) coincide com o padrão" caso arquivo seja um arquivo PDF. Se não for PDF, o comando acima não retornará mensagem nenhuma (resposta vazia). Para arquivos DOC e DOCX você deve substituir pdf por doc, no comando acima (ali logo depois do grep -i), e para arquivos XLS e XLSX use excel no lugar de pdf.

Os navegadores mais populares, como por exemplo Google Chrome e Mozilla Firefox, conseguem visualizar arquivos PDF, TXT, RTF etc. dentro da própria janela deles (além, obviamente, de arquivos HTM, HTML e alguns em formato PHP), então se por exemplo você abrir uma janela do Google Chrome e abrir este endereço:

Citarfile:///tmp/arquivo

...o Google Chrome mostrará para você uma visualização do arquivo, caso arquivo esteja em um formato que o Google Chrome é capaz de reconhecer e exibir para visualização (se não estiver, o navegador fará download do arquivo ao invés de exibi-lo na própria janela).



VISUALIZANDO A ASSINATURA DO ARQUIVO P7S

Agora que você já extraiu o conteúdo de arquivo.p7s e o visualizou, digamos que você queira ver o certificado da assinatura criptográfica dele, ou seja, queira saber quem assinou o arquivo, quando assinou, qual a chave criptográfica do certificado usado nessa assinatura etc. E aí, como fazer isso?

Em tal caso, basta retornar ao terminal e executar este comando:

openssl smime -inform DER -verify -in arquivo.p7s -noverify -signer cert.pem

O resultado desse comando será o arquivo cert.pem que conterá o certificado usado na assinatura do arquivo. Para visualizá-lo, basta executá-lo (com um clique duplo, ou ainda selecionando o arquivo e em seguida pressionando a tecla Enter). No terminal você pode abrir esse arquivo com este comando:

mimeopen cert.pem

Caso sua distribuição Linux não possua um visualizador para arquivos PEM, e por isto nenhum dos métodos de visualização anteriormente citados funcione, retorne ao terminal e execute este comando mais completo:

openssl smime -inform DER -verify -in arquivo.p7s -noverify -signer cert.pem ; keytool -printcert -file cert.pem > cert.txt

O comando acima produzirá o mesmo arquivo cert.pem mas o usará para gerar o arquivo cert.txt que conterá os dados do certificado em formato de texto puro, que você poderá então abrir com qualquer visualizador e/ou editor de textos, ou até mesmo no seu navegador, abrindo este endereço ali na barra de endereços (supondo que o arquivo esteja em /tmp/cert.txt):

Citarfile:///tmp/cert.txt

É isso.  ;D

EDIT: existe uma aplicação, denominada XCA, que é capaz de ler arquivos de certificado. Para instalar a aplicação XCA, basta executar este comando:

sudo apt-get install xca -y

...e em seguida executar o XCA, criar um novo banco de dados² e então, na aba Certificates, clicar no botão Import, selecionar o arquivo cert.pem e clicar em Abrir. Uma vez feito isso, o certificado aparecerá na janela. Basta efetuar um clique duplo sobre a linha que contém as informações resumidas do certificado (ou então clicar uma vez nele e em seguida clicar no botão Show Details) que as informações completas do certificado serão exibidas.

Elaborei também uma pequena apresentação de diapositivos (slides) no Google Slides. A apresentação explica o mesmo que o tutorial acima, só que de maneira gráfica e um pouco mais resumida. Quem quiser ver, basta clicar aqui.

Se quiser utilizar um visualizador gráfico de arquivos P7S, veja este meu tutorial (ele também está em formato de apresentação de slides do Google Slides). Importante: será necessário possuir o JRE (Ambiente de Execução Java) instalado no sistema.

Notas de rodapé
¹ A abreviatura CAdES significa CMS Advanced Electronic Signature, ou seja: "Assinatura Eletrônica CMS Avançada". E a abreviatura CMS significa Cryptographic Message Syntax, ou seja: "Sintaxe de Mensagem Criptográfica". Portanto, CAdES é um formato avançado de assinatura eletrônica em que essa assinatura é construída utilizando-se uma sintaxe de mensagens criptográficas.

² Na janela do aplicativo XCA, use a combinação de teclas Ctrl N (ou então clique em File e depois em New Database), então selecione uma pasta na qual deseja guardar o banco de dados, digite um nome para o banco de dados e confirme clicando em Salvar.
Yuri Sucupira ("Sampayu")

jrkamil

exelente tópico. muito didático e bem redigido. parabéns Sampayu
Asus M5A78L-M Plus , Phenon II X6 , 16 Gb DDR3, Radeon R5 220,  ubuntu  24.04  gnome, ssd 240G, hd 500 G

Sampayu

Citação de: jrkamil online 08 de Fevereiro de 2020, 09:17
exelente tópico. muito didático e bem redigido. parabéns Sampayu

Obrigado. :D Não encontrei nenhuma dica sobre isso no fórum e achei que seria uma boa incluir, para o caso de alguém mais passar pelo que passei com a certidão digital ou com outro documento digitalmente assinado nesse formato CAdES. Espero que ajude outras pessoas. :) Abraço.
Yuri Sucupira ("Sampayu")

platao

\\\\\\\\Apostilas Dicas e Guias do Ubuntu\\\\\\\\\> http://ubuntuforum-br.org/index.php/topic,79368.msg440997.html#msg440997

Sampayu

Citação de: platao online 08 de Fevereiro de 2020, 13:34
Muito bom nao vi isso em nenhum outro lugar!!!

Obrigado. :) Aqui no fórum inteiro realmente não há nada abordando esse assunto, e mesmo em pesquisas no Google as informações disponíveis geralmente são voltadas para Windows. Para Linux a literatura (pelo menos em português) é bem escassa... Mas o Linux é um sistema poderoso, então com a simples instalação de um pacote e execução de poucos comandos é possível obter o arquivo descriptografado e o conteúdo do certificado dele.

Os cartórios do Brasil estão gradualmente aderindo às certidões digitais. A tendência, a médio-longo prazo, é que cada vez mais certidões sejam solicitadas, geradas e enviadas eletronicamente, ou seja, sem que seja necessário a pessoa ir até o cartório, protocolar o pedido e retornar alguns dias depois para pegar o papel. Ainda mais que hoje em dia essas certidões têm validade jurídica de somente 30 dias, não vale a pena despender tanto tempo com um processo burocrático inteiro que vai lhe fornecer um documento com prazo de validade tão curto. Nesse sentido, a compra de certidões (de nascimento, de casamento, de óbito, de matrícula de imóvel, negativa de testamento etc.) em formato digital (criptografado) é uma tendência, até porque pode-se gerar múltiplas cópias do mesmo arquivo de certidão, enviar essas cópias por e-mail, Whatsapp etc. (diferentemente da certidão em papel, que tem de ser enviada via Correios e não dá pra fazer cópias de graça, sendo necessário tirar cópias autenticadas), papel envelhece e fica amarelado mas arquivo não, e assim por diante.

Eu fiz o pedido da certidão no website https://www.registradores.org.br, paguei online com cartão de crédito e no dia seguinte o arquivo da certidão já estava disponível para download. Muito cômodo, prático e rápido. Mas os arquivos são fornecidos com extensão P7S, então é necessário conhecer esse formato e aprender a utilizá-lo. Daí esta dica. Como escrevi antes para o jrkamil, espero que esta dica venha a ser útil para outras pessoas que comprem certidões pela Internet (ou outros arquivos digitais também). Aos poucos as pessoas vão usar mais e mais arquivos criptografados, daí este assunto vai (creio eu) ganhar mais notoriedade. Vou deixar a dica aqui e esperar o tempo dizer se minha impressão está correta ou equivocada. :D Mas pelo menos o pontapé inicial foi dado, rs. Abraço.
Yuri Sucupira ("Sampayu")