Criptografia em AdvPL – Parte 12

Introdução

No post anterior vimos as dicas de ouro de uso da OpenSSL !! Agora, vamos ver um pouco mais sobre os certificados digitais, e as funções do AdvPL de manipulação / conversão de certificados e chaves. Para ver tudo o que já foi publicado nessa série de posts, acesse o link Criptografia e Segurança.

Funções AdvPL para manipulação de Certificados Digitais

No Post 01, vimos uma lista de funções do AdvPL para manipulação de certificados digitais e chaves criptográficas. O objetivo desse grupo de funções é obter algumas informações dos certificados, e realizar a conversão de certificados e chaves de diversos formatos para o formato PEM — usado e suportado pelo TOTVS Application Server e seus componentes.

Função AdvPL PEMInfo()

Documentada no TDN no link http://tdn.totvs.com/display/tec/PEMInfo, essa função permite recuperar algumas informações de um certificado digital armazenado no formado codificado em Base64  (formato PEM/CRT), como a versão do certificado, validade (de-até), emissor, destinatário ou assunto, número serial e Thumbprint ou Fingerprint do certificado (representados em Base64 e hexadecimal). Vamos ver o que ela retorna quando executamos um fonte de testes que abre aquele certificado digital que geramos no Post 06 usando o fonte abaixo:

User Function PemInfo()
Local nI,nJ
Local cFile := '\certificates\note-juliow-ssd.cer'
Local aRet
Conout('Arquivo ......... '+cFile)
aRet := PemInfo(cFile)
Conout('Certificados .... '+cValToChar(len(aRet)))
For nI := 1 to len(aRet)
  Conout('Certificado ['+cValToChar(nI)+']')
  For nJ := 1 to len(aRet[nI])
    conout('['+cValToChar(nJ)+'] '+cValToChar(aRet[nI][nJ]))
  Next 
Next
Return

Antes de executar este código, crie uma pasta chamada “certificates” a partir do rootpath do ambiente, e copie o certificado a ser verificado para dentro dela. Não precisa copiar a chave (key), apenas o certificado. Ao executar o programa usando o certificado gerado anteriormente, o resultado no log de console foi:

Arquivo ......... \certificates\note-juliow-ssd.cer
Certificados .... 1
Certificado [1]
[1] 2
[2] /C=BR/ST=SP/L=Sao Paulo/O=Tudo em AdvPL/CN=note-juliow-ssd
[3] /C=BR/ST=SP/L=Sao Paulo/O=Tudo em AdvPL/CN=note-juliow-ssd
[4] 190816000619Z
[5] 200815000619Z
[6] 540424256993644162400613528322498278498171836889
[7] UVSmBFw2nXziHOJ2wivsBfqRjwg=
[8] 5154a6045c369d7ce21ce276c22bec05fa918f08

Um arquivo pode conter mais de um certificado. Logo, o array retornado sempre é multi-dimensional, onde cada elemento contém um array com 8 propriedades do certificado. No nosso caso, o arquivo contém apenas um certificado. Cada elemento retornado no array indica uma propriedade do certificado:

Índice

Tipo

Dado

1 N Versão (0=Versão 1, 1=Versão 2, 2=Versão 3)
2 C Destinatário (Subject)
3 C Emissor (Issuer)
4 C Data de Validade Inicial
5 C Data de Validade Final
6 C Número serial
7 C Fingerprint/Thumbprint (Base64)
8 C Fingerprint/Thumbprint (Hexadecimal)

Observações

  • As datas de validade inicial e final são retornadas no formado “AAMMDDhhmmssZ” (ano,mes,dia,hora,minuto e segundo, todos com 2 dígitos e o sufixo “Z”, que identifica uma hora universal (GMT).
  • O número serial (índice 5) parece estar sendo retornado com um valor decimal.
  • Os valores do Fingerprint/ThumbPrint são calculados para o certificado — usando SHA1 por default — e retornados em duas formas: Hexadecimal e Base64. Caso seja necessário retornar esta informação usando outro algoritmo de hash, basta especificar o algoritmo desejado no terceiro parâmetro da função.

Usando a OpenSSL

Podemos utilizar o comando abaixo da OpenSSL para ler as informações do certificado:

openssl x509 -in note-juliow-ssd.cer -noout -text -fingerprint

E com ele obtemos o resultado abaixo:

Version: 3 (0x2)
Serial Number:
5e:a9:76:38:db:c0:3c:5e:cf:f6:8b:e0:cf:7c:b8:5c:ad:87:59:d9
Issuer: C = BR, ST = SP, L = Sao Paulo, O = Tudo em AdvPL, CN = note-juliow-ssd
Validity
Not Before: Aug 16 00:06:19 2019 GMT
Not After : Aug 15 00:06:19 2020 GMT
Subject: C = BR, ST = SP, L = Sao Paulo, O = Tudo em AdvPL, CN = note-juliow-ssd
SHA1 Fingerprint=51:54:A6:04:5C:36:9D:7C:E2:1C:E2:76:C2:2B:EC:05:FA:91:8F:08

Função AdvPL WriteRSAPK()

Documentada no TDN no link http://tdn.totvs.com/display/tec/WriteRSAPK, a função WriteRSAPK() foi criada para permitir a conversão de uma chave privada no formato DER para PEM, bastando informar onde está o arquivo com a chave privada de origem, e onde deve ser gerada a chave de destino.

Uma chave privada ou mesmo um certificado digital são salvos em disco normalmente usando dois formatos:

  • Arquivo texto codificado em Base64 — formato PEM
  • Arquivo ASCII binário — Formato DER

Os formatos PEM são usados por exemplo em servidores Apache e similares, enquanto o formato DER é usado em aplicações Java. O conteúdo da chave privada é o mesmo, o que muda é a forma de representação da chave do arquivo. Como os formatos de certificados e chaves no TOTVS Application Server são os do Apache (PEM), todas as demais funções de conversão de certificados e chaves do AdvPL até o momento convertem informações, certificados e chaves de outros formatos ( PKCS, PFX, DER ) para PEM.

Funções de suporte ao formato PFX/PKCS12

O formato PFX (ou PKCS12) — usado pelo Windows / IIS por exemplo — é um container que permite encapsular — dentro do mesmo aquivo — por exemplo um ou mais certificados digitais, certificado(s) da cadeia de autenticação, chaves privadas e outros. Para facilitar a extração e conversão destas informações de um arquivo no formato PFX para PEM, o AdvPL disponibiliza as seguintes funções:

E, adicionalmente, para obter a lista de informações que estão dentro de um determinado arquivo PFX, temos também a função PFXInfo – http://tdn.totvs.com/display/tec/PFXInfo. Esta função retorna apenas informações básicas sobre o certificado principal e o(s) certificados da Autoridade Certificadora — quando presentes — do arquivo, como por exemplo a verão do certificado, emissor, destinatário e datas de validade inicial e final.

Todas as funções acima têm em comum o arquivo PFX a ser avaliado e um parâmetro opcional de senha, que deve ser utilizado quando o arquivo PFX estiver protegido por senha. E, claro, a função somente obterá sucesso se o arquivo PFX utilizado tiver a informação que será extraída 😀

Formatos PKCS7 (P7B) e PKCS8

Além dos formatos já vistos, ainda temos o PKCS e PKCS8, que podem ser usados para guardar uma chave privada. Para extrair a chave privadas destes formatos para o formato PEM em AdvPL, podemos usar as funções abaixo:

Conclusão

Agora que já vimos hash criptográfico, uso de certificados da infra-estrutura do TOTVS Application Server — HTTPS e conexão segura com SmartClient, nos próximos posts serão abordadas funcionalidades de assinatura digital usando o AdvPL 😀

Agradeço novamente a audiência e lhes desejo TERABYTES DE SUCESSO !!!

Referências

 

Um comentário sobre “Criptografia em AdvPL – Parte 12

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s