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.
Existem dois sub-comandos distintos para manipular chaves RSA:
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
Outras operações sobre chaves RSA incluem:
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
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
openssl rsa -in rsa_key_file [-text|modulus|...]
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
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
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
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
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
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
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
Gerar chave publica + privada (ssh-keygen);
Copiar chave publica para $HOME/.ssh/authorized_keys na máquina remota (onde se deseja entrar sem necessidade de login);
Usar mais do que uma chave privada;
Usar o ssh-agent.