Criptografia em AdvPL – Parte 11

Introdução

Até agora vimos alguns exemplos de uso da OpenSSL para realizar operações com certificados e chaves. Agora, vamos dar uma repassada nas funcionalidades da ferramenta, e ver algumas considerações e dicas de utilização 😀 Para acessar o índice com todas as publicações sobre o tema Criptografia em AdvPL, acesse o link Criptografia e Segurança

OpenSSL

Em posts anteriores, vimos como instalar uma versão da OpenSSL já “pronta” para Windows, e utilizamos vários comandos para os exemplos de certificados e chaves. Mas não chegamos nem perto de ver tudo o que ela pode fazer. Meu objetivo não é dar um curso de OpenSSL, mas sim compartilhar as fontes de busca que eu usei, e as conclusões que eu cheguei nesta primeira semana de uso da ferramenta.

OpenSSL tem muito mais do que apenas a linha de comandos

Quando instalamos por exemplo a OpenSSL completa no Windows, não temos apenas a linha de comandos, mas também os arquivos necessários para você criar por exemplo um projeto em C++ usando um compilador ou ferramenta de sua preferência para usar as funções da LIB OPENSSL, que já vêm com versões prontas para uso, com os respectivos arquivos de include — para usar as funções e os tipos de dados declarados na biblioteca.

A aplicação via linha de comandos faz muita coisa

Em todos os exemplos até o momento, usamos as chamadas da OpenSSL para realizar tarefas específicas através de argumentos. Existe uma relação enorme de funcionalidades, e também existe o modo “interativo”, onde executamos a openssl sem nenhum parâmetro, e ela nos oferece um interpretador de comandos para realizar diversas operações interativas, como por exemplo estabelecer uma conexão segura com um provedor de emails (POP, IMAP, SMPT), testar a aderência de um certificado em  uma conexão segura com um Web Service usando HTTPS com autenticação mútua, etc…

Pequeno resumo de operações

Quando executamos o comando “openssl help“, temos uma ideia de tudo o que dá pra fazer …

Standard commands
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dhparam
dsa dsaparam ec ecparam
enc engine errstr gendsa
genpkey genrsa help list
nseq ocsp passwd pkcs12
pkcs7 pkcs8 pkey pkeyparam
pkeyutl prime rand rehash
req rsa rsautl s_client
s_server s_time sess_id smime
speed spkac srp storeutl
ts verify version x509

Message Digest commands (see the `dgst' command for more details)
blake2b512 blake2s256 gost md4
md5 mdc2 rmd160 sha1
sha224 sha256 sha3-224 sha3-256
sha3-384 sha3-512 sha384 sha512
sha512-224 sha512-256 shake128 shake256
sm3

Cipher commands (see the `enc' command for more details)
aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
aes-256-cbc aes-256-ecb aria-128-cbc aria-128-cfb
aria-128-cfb1 aria-128-cfb8 aria-128-ctr aria-128-ecb
aria-128-ofb aria-192-cbc aria-192-cfb aria-192-cfb1
aria-192-cfb8 aria-192-ctr aria-192-ecb aria-192-ofb
aria-256-cbc aria-256-cfb aria-256-cfb1 aria-256-cfb8
aria-256-ctr aria-256-ecb aria-256-ofb base64
bf bf-cbc bf-cfb bf-ecb
bf-ofb camellia-128-cbc camellia-128-ecb camellia-192-cbc
camellia-192-ecb camellia-256-cbc camellia-256-ecb cast
cast-cbc cast5-cbc cast5-cfb cast5-ecb
cast5-ofb des des-cbc des-cfb
des-ecb des-ede des-ede-cbc des-ede-cfb
des-ede-ofb des-ede3 des-ede3-cbc des-ede3-cfb
des-ede3-ofb des-ofb des3 desx
idea idea-cbc idea-cfb idea-ecb
idea-ofb rc2 rc2-40-cbc rc2-64-cbc
rc2-cbc rc2-cfb rc2-ecb rc2-ofb
rc4 rc4-40 seed seed-cbc
seed-cfb seed-ecb seed-ofb sm4-cbc
sm4-cfb sm4-ctr sm4-ecb sm4-ofb

Logo de cara são pelo menos 48 comandos, cada um deles abre um leque de opções. Para ver por exemplo o que pode fazer o comando x509 ou qualquer outro comando, use a sintaxe openssl <comando> -help, por exemplo:

openssl x509 -help
Usage: x509 [options]
Valid options are:
-help Display this summary
-inform format Input format - default PEM (one of DER or PEM)
-in infile Input file - default stdin
-outform format Output format - default PEM (one of DER or PEM)
-out outfile Output file - default stdout
-keyform PEM|DER Private key format - default PEM
-passin val Private key password/pass-phrase source
-serial Print serial number value
-subject_hash Print subject hash value
-issuer_hash Print issuer hash value
-hash Synonym for -subject_hash
-subject Print subject DN
-issuer Print issuer DN
-email Print email address(es)
-startdate Set notBefore field
-enddate Set notAfter field
-purpose Print out certificate purposes
-dates Both Before and After dates
-modulus Print the RSA key modulus
-pubkey Output the public key
-fingerprint Print the certificate fingerprint
-alias Output certificate alias
-noout No output, just status
-nocert No certificate output
-ocspid Print OCSP hash values for the subject name and public key
-ocsp_uri Print OCSP Responder URL(s)
-trustout Output a trusted certificate
-clrtrust Clear all trusted purposes
-clrext Clear all certificate extensions
-addtrust val Trust certificate for a given purpose
-addreject val Reject certificate for a given purpose
-setalias val Set certificate alias
-days int How long till expiry of a signed certificate - def 30 days
-checkend intmax Check whether the cert expires in the next arg seconds
Exit 1 if so, 0 if not
-signkey infile Self sign cert with arg
-x509toreq Output a certification request object
-req Input is a certificate request, sign and output
-CA infile Set the CA certificate, must be PEM format
-CAkey val The CA key, must be PEM format; if not in CAfile
-CAcreateserial Create serial number file if it does not exist
-CAserial val Serial file
-set_serial val Serial number to use
-text Print the certificate in text form
-ext val Print various X509V3 extensions
-C Print out C code forms
-extfile infile File with X509V3 extensions to add
-rand val Load the file(s) into the random number generator
-writerand outfile Write random data to the specified file
-extensions val Section from config file to use
-nameopt val Various certificate name options
-certopt val Various certificate text options
-checkhost val Check certificate matches host
-checkemail val Check certificate matches email
-checkip val Check certificate matches ipaddr
-CAform PEM|DER CA format - default PEM
-CAkeyform format CA key format - default PEM
-sigopt val Signature parameter in n:v form
-force_pubkey infile Force the Key to put inside certificate
-next_serial Increment current certificate serial number
-clrreject Clears all the prohibited or rejected uses of the certificate
-badsig Corrupt last byte of certificate signature (for test)
-* Any supported digest
-subject_hash_old Print old-style (MD5) issuer hash value
-issuer_hash_old Print old-style (MD5) subject hash value
-engine val Use engine, possibly a hardware device
-preserve_dates preserve existing dates when signing

Quer ver TUDO o que pode ser feito com linhas de comando na OPENSS ? Acesse a documentação oficial no Acesse o link https://wiki.openssl.org/index.php/Command_Line_Utilities, ele começa com um overview e alguns exemplos mais comuns, e no final da página, um índice para a documentação completa de cada comando disponível. Lembre-se de verificar qual a versão da OpenSSL que você está usando ( use o comando openssl version ), pois alguns parâmetros ou propriedades podem ter sido descontinuados ou implementados apenas em uma versão superior

openssl version
OpenSSL 1.1.1c 28 May 2019

Dica de Ouro 01

Como as especificações de segurança, certificados, chaves e afins são imensas, embora muita coisa possa ser feita com diversos parâmetros em linhas de comando, existem configurações default para várias operações pré-definidas no arquivo de configuração da openssl — normalmente um arquivo chamado  “openssl.cfg” ou “openssl.cnf”, dependendo da definição ou ausência da variável de ambiente OPENSSL_CONF que aponte para um arquivo default de configuração.

Quando você vai realizar determinadas operações, como emissão de certificados, assinaturas, chaves e afins para contextos diferentes, é muito interessante você criar seus arquivos de configuração, alterá-los e acrescentar as demais definições que você precisa dentro deles. Boa parte dos comandos que dependem de configuração aceitam o parâmetro “-config <configfile>“, onde podemos informar qual arquivo de configurações que deve ser utilizado. Isso diminui muito a necessidade de parâmetros adicionais nos comandos, mas ainda assim permite especificar parâmetros adicionais que, quando informados, têm precedência sobre os parâmetros de linha.

Dica de Ouro 02

Muitos parâmetros em linha de comando são comuns a muitos comandos, como -in , -out , -text, -noout — usados respectivamente para especificar um ou mais arquivos de entrada, um arquivo de saída, um formato de sai da em modo texto e inibir a saída de um resultado no console, por exemplo.

 openssl pkey -in private-key.pem -text

Usamos o comando pkey, para lidar com chaves privadas, especificamos que vamos usar como entrada (in) o arquivo private-key.pem, e queremos o resultado em formato texto. Ao executar este comando em uma chave privada previamente gerada, o resultado em tela vai a chave privada usada como entrada, e depois todos os dados da chave. Se quisermos uma saída onde a chave de entrada não seja mostrada, usamos o parâmetro “-noout”.

Dica de Ouro 03

Meu chapa, OPENSSL não é um projeto que nasceu ontem, têm documentação a rodo na internet. Quem já passou por algum apuro pra tentar fazer algo funcionar normalmente compartilha o embrolho e a resposta. Pergunte para o “Mestre Google”, que ele vai encontrar ou te levar para perto de onde está a resposta. Stack Overflow, blogs, inúmeros how-to estão disponíveis. Tudo o que eu compartilhei com vocês nesses últimos posts sobre criptografia e OpenSSL eu aprendi com pesquisas de múltiplas fontes e testes de prova de conceito.

A grande sacada é você não tentar entender tudo de uma vez, o “tudo” é grande demais, a Wikipedia tem páginas e mais páginas sobre todos esses assuntos. Não se limite a pesquisar na Wiki em Português, normalmente os conteúdos são bem mais superficiais do que o mesmo assunto na Wiki em inglês. Quando eu comecei a apender Clipper, literalmente no século passado, o guia de funções e comandos era inteiro em Inglês, e a Internet ainda não tinha chego por aqui …. Logo, meu dicionário de inglês-português era item permanente na minha mesa. Hoje você tem Internet e o Google Translator, use-os !!!

Se uma especificação completa parece complicada, encontre uma fonte de informação menos abrangente, ou que transmita o conceito. A infraestrutura de chaves criptográficas é enorme, mas quando você entende um minimo sobre as partes básicas envolvidas, o resto são propriedades e derivações sobre a mesma base. Toda a linguagem de programação tem IF e LOOP, o que muda é a sintaxe.

Dica de Ouro 04

Qualquer conhecimento é melhor assimilado se você não apenas lê, mas USA. Isso é válido pra tudo, não só pra OpenSSL e criptografia. Quer aprender a programar ? Idealize um programa simples e faça-o. Cada parte do programa vai exigir que você pesquise como fazer, e somente o uso disso vai te trazer experiência, não apenas conhecimento.

Conclusão

Com esta série de posts, eu acho que já temos uma introdução bem “consistente” sobre esse assunto, a partir de agora vamos ver nos próximos posts o que mais temos no AdvPL onde isso pode ser usado, e como usar !!!

Agradeço a todos pela audiência, e lhes desejo TERABYTES DE SUCESSO !!!

Referências

 

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