How-to openSSL

Este documento é derivado do documento http://www.madboa.com/geek/openssl/.

Para informação teórica sobre cifragem, autenticação, integridade e confidencialidade bem como sobre algoritmos de cifragem/decifragem, ver http://www.dei.isep.ipp.pt/~andre/documentos/criptografia.html e http://www.dei.isep.ipp.pt/~andre/documentos/assinatura-digital.html.

Chaves RSA

Existem dois sub-comandos distintos para manipular chaves RSA:

Geração

Na sua forma mais simples, para gera uma chave RSA pode-se usar o comando da seguinte forma:

# default 512-bit key, sent to standard output
openssl genrsa

No entanto, é muitas vezes conveniente usar a seguinte forma:

openssl genrsa -out rsa_key_file [num_bits]

Nesta forma, uma chave rsa é gerada e guardada no ficheiro rsa_key_file. O parâmetro num_bits é opcional e define o tamanho da chave.
Por omissão, a chave tem 512 bits de comprimento.

# chave de 1024-bits, guardada em rsa_key_file
openssl genrsa -out rsa_key_file 1024

É também possível encriptar a chave com uma palavra/frase secreta, de forma a que a chave rsa não possa ser usada sem o conhecimento dessa palavra/frase.

# encriptada com uma palavra ou frase secreta
openssl genrsa -des3 -out rsa_key_file 1024

Restantes operações

Outras operações sobre chaves RSA incluem:

Desencriptação e encriptação da chave

Para desencriptar a chave RSA basta usar o comando rsa sobre a chave RSA:

openssl rsa -in rsa_key_file -out rsa_key_desenc_file

Para encriptar a chave RSA, para além de usar o próprio comando genrsa, pode-se usar o parâmetro de encriptação (ex. des, des3):

openssl rsa -des3 -in rsa_key_file -out rsa_key_enc_file

Geração de chave pública

A partir da chave RSA gerada anteriormente, pode-se (e tem de se) gerar uma chave pública.
Para isso tem de se usar o parâmatro -pubout:

openssl rsa -in rsa_key_file -pubout

Visualização de parâmetros de geração

openssl rsa -in rsa_key_file [-text|modulus|...]

Digests (ou Hash Codes)

Geração de digests

Digests ou hashs são criados usando o sub-comando dgst:

openssl dgst -func inputfile

Em que -func corresponde ao algorítmo de digest/hashing que se deseja usar (ex. md2, md5, sha, sha1).

# MD5 digest
openssl dgst -md5 filename
# SHA1 digest
openssl dgst -sha1 filename

Para se saber a lista de algoritmos de digest/hashing pode-se executar o comando:

openssl dgst help

Assinatura de digests/hash

Se se desejar garantir que o digest criado não é modificado sem permissão pode-se assiná-lo com uma chave privada (RSA por exemplo).

openssl dgst -md5 -sign rsa_key_file -out signed_digest_file input_file

Para se verificar que o digest não foi alterado desde a sua geração, necessita-se do ficheiro original, do digest assinado e da chave pública:

openssl dgst -md5 -verify rsa_key_pub -signature signed_digest_file input_file

Certificados

Uma das formas mais simples de criar um certificado é executando o comando:

openssl req -x509 -new -newkey rsa:1024 -out mycert.pem -keyout rsa_key_file

Depois de questionar o utilizador sobre determinada informação de localização (ex. País, Cidade, mail) e organização cria um certificado com 1024 bits de comprimento, cuja chave privada é gerada para o ficheiro rsa_key_file.

O comando seguinte não necessita que o utilizador introduza a informação atrás referida:

openssl req -x509 -nodes -days 365 \
-subj '/C=PT/ST=Porto/L=Porto/CN=www.dei.isep.ipp.pt' \
-newkey rsa:1024 -keyout mycert.pem -out mycert.pem

Se se desejar criar um certificado a partir duma chave rsa já existente, pode-se usar o seguinte comando:

openssl req -x509 -new -key rsa_key_file -out mycert.pem

Para se extrair a informação do certificado, pode-se usar o comando seguinte:

openssl x509 -text -in mycert.pem

Outros parâmtros para o subcomando x509 permitem aceder a informação de forma mais direccionada. Por exemplo:

# who issued the cert?
openssl x509 -noout -in cert.pem -issuer
# to whom was it issued?
openssl x509 -noout -in cert.pem -subject
# for what dates is it valid?
openssl x509 -noout -in cert.pem -dates
# the above, all at once
openssl x509 -noout -in cert.pem -issuer -subject -dates
# what is its hash value?
openssl x509 -noout -in cert.pem -hash
# what is its MD5 fingerprint?
openssl x509 -noout -in cert.pem -fingerprint

Cifrar/Decifrar com algoritmos e passwords

Para se encriptar ou desencriptar um conjunto de bytes usa-se o sub-comando enc.

Para encriptar um conjunto de bytes necessita-se de usar um algoritmo/método de cifragem.
Para se aceder a uma lsitaem dos algoritmos/métodos de cigragem usa-se o comando:

openssl list-cipher_commands

Para além dos "cifradores" disponíveis, acede-se a uma lista de parâmetros existentes para o sub-comando enc.

Para se encriptar um ficheiro usa-se o comando:

openssl enc -cipher -e -in input_file -encrypted_file

O parâmetro -cipher deve ser substituído por um método de encriptação disponível (ex. des, des3, bf, idea).
O parâmetro -e refere-se a "encriptação". Se for substituído -d faz-se a desencriptação:

openssl env -cipher -d -in encrypted_file -decrypted_file

Um parámetro normalmente bastante útil nas tarefas anteriores tem a ver com a codificação da encriptação. Se se desejar que a condificação seja em base64 deve-se usar o parâmetro -a. Com este parâmetro, é possível visualizar o conteúdo do ficheiro e transferi-lo entre máquinas.

openssl enc -des -e -a -in input_file -out encrypted_file

Cifrar/Decifrar com chave RSA

Para se cifrar e descifrar com chaves rsa usa-se o subcomando rsautl.

# cifra o ficheiro input_file com a chave publica contida em rsa_key_file
openssl rsautl -encrypt -in input_file -pubin -inkey rsa_pub_file -out output_file_encrypted
# decifra o ficheiro input_file com a chave privada contida em rsa_key_file
openssl rsautl -decrypt -in output_file_encrypted -inkey rsa_key_file -in decrypted_file

Cifrar/Decifrar com certificados e chave RSA

Para se decifrar com certificados e chave RSA vamos usar o subcomando smime. s/mime é um standard para envio e recepção de dados MIME seguros, usado especialmente em mensagens de mail, mas que podem ser usadas noutras aplicações.

Para se cifrar um ficheiro usa-se o comando:

openssl smime -in input_file -encrypt -out output_file_encrypted -des3 mycert.pem

Para decifrarmos o ficheiro cifrado com o comando anterior usa-se:

openssl smime -decrypt -in output_file_encrypted -recip mycert.pem -inkey rsa_key_file 

Assinaturas digitais

Para gerar uma assinatura digital é necessário uma chave privada:

openssl dgst -md5 -sign rsa_key_file input_file -out output_file_signature

Para verificarmos uma assinatura digital:

openssl dgst -md5 -verify -signature output_file_signature input_file

Exercício: RSA e SSH

Last update: 2006-01-16