Autor Tópico: [DICA] Como extrair o conteúdo de um arquivo criptografado com extensão P7S  (Lida 740 vezes)

Offline Sampayu

  • Usuário Ubuntu
  • *
  • Mensagens: 436
  • "Não é possível semear de mãos fechadas"
    • Ver perfil
    • YouTube

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:
Código: [Selecionar]
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:
Código: [Selecionar]
cd /tmp
...e em seguida executo este comando para criar o arquivo descriptografado certidao.pdf a partir do original certidao.pdf.p7s:
Código: [Selecionar]
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:
Código: [Selecionar]
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:
Código: [Selecionar]
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:
Código: [Selecionar]
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:

Citar
file:///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:

Código: [Selecionar]
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:

Código: [Selecionar]
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:

Código: [Selecionar]
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):

Citar
file:///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:

Código: [Selecionar]
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.

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.
« Última modificação: 08 de Fevereiro de 2020, 09:05 por Sampayu »
Yuri Sucupira ("Sampayu")

Offline jrkamil

  • Usuário Ubuntu
  • *
  • Mensagens: 433
  • Cabo Frio - RJ - Brasil
    • Ver perfil
Re:[DICA] Como extrair o conteúdo de um arquivo criptografado com extensão P7S
« Resposta #1 Online: 08 de Fevereiro de 2020, 09:17 »
exelente tópico. muito didático e bem redigido. parabéns Sampayu
ECS A890GXM-A , Phenon II X6 , 8 Gb DDR3, nvidia GT 730,  ubuntu  19.10  gnome, ssd 120G, hd 500 g

Offline Sampayu

  • Usuário Ubuntu
  • *
  • Mensagens: 436
  • "Não é possível semear de mãos fechadas"
    • Ver perfil
    • YouTube
Re:[DICA] Como extrair o conteúdo de um arquivo criptografado com extensão P7S
« Resposta #2 Online: 08 de Fevereiro de 2020, 09:38 »
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")

Offline platao

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 5.001
    • Ver perfil
Re:[DICA] Como extrair o conteúdo de um arquivo criptografado com extensão P7S
« Resposta #3 Online: 08 de Fevereiro de 2020, 13:34 »
Muito bom nao vi isso em nenhum outro lugar!!!
\\\\\\\\Apostilas Dicas e Guias do Ubuntu\\\\\\\\\> http://ubuntuforum-br.org/index.php/topic,79368.msg440997.html#msg440997

Offline Sampayu

  • Usuário Ubuntu
  • *
  • Mensagens: 436
  • "Não é possível semear de mãos fechadas"
    • Ver perfil
    • YouTube
Re:[DICA] Como extrair o conteúdo de um arquivo criptografado com extensão P7S
« Resposta #4 Online: 08 de Fevereiro de 2020, 23:36 »
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.
« Última modificação: 08 de Fevereiro de 2020, 23:38 por Sampayu »
Yuri Sucupira ("Sampayu")