Certificados Digitais RSA

A proposta do artigo é introduzir o leitor os conceitos básicos que envolvem a criação, leitura, autenticação e assinatura de certificados digitais. Será abordada a criação de uma cadeia de certificados para uso em um ambiente de desenvolvimento, de forma que ao longo dos procedimentos construiremos as chaves públicas e privadas das autoridades certificadoras, algo que não ocorre em ambientes produtivos.

1. Introdução

Dentre os elementos que o artigo se propõem abordar está o de fornecer informações sobre os conceitos envolvidos em processos de comunicação seguro SSL/TLS. Isso implica em apresentar os conceitos básicos envolvidos, os jargões utilizados nos manuais e artigos externos, ferramentas utilizadas na operação e manutenção, e possibilitar pequenos estudos de casos.

1.1. Pré-Requisitos

Para o acompanhamento dos procedimentos executados neste artigo serão necessários algumas ferramentas.

1.1.1. Sistema Operacional

O artigo foi elaborado utilizando o sistema operacional Windows 7 x64 Professional. Não há nenhuma contraindicação quanto ao uso de outro sistema operacional. As ferramentas utilizadas ao longo da exposição dos conceitos estão disponíveis em sistemas operacionais como distribuições Linux, MacOS, entre outros.

1.1.2. OpenSSL

Ao longo do artigo será referenciado operações e comandos para a manipulação de informação de chaves privadas, e certificados públicos com a ferramenta OpenSSL. A aplicação pode ser obtida junto com a distribuição dos binários para o sistema operacional Windows x64 no site:

https://slproweb.com/products/Win32OpenSSL.html

Ao instalar a ferramenta o executável principal de nome openssl.exe estará disponível na pasta bin do diretório de instalação. Essa localização deve ser adicionada à variável de ambiente do sistema operacional PATH

No Windows há duas formas de executar esse procedimento:

  • Incluindo o caminho dos binários nas variáveis de ambientes do sistema pela janela de "Propriedades do Sistema" (comando systempropertiesadvanced.exe).
  • Exportando o caminho temporariamente em uma janela de console, como apresentado na figura abaixo.

Cripto_101.png

Figura 1.1. Comando de inclusão do PATH OpenSSL nas variáveis de ambiente.

Obs: As versões recentes da biblioteca OpenSSL desde a versão 1.0.1 em diante, não habilitam o uso da versão SSL2 do protocolo por padrão. Os testes aqui apresentados não utilizarão conexões SSL2 pela indisponibilidade desta ferramenta.

2. Criptografia

O objetivo fundamental deste tópico é apresentar os conceitos mínimos de criptografia voltados ao uso de certificados digitais. Servirá também como um ponto inicial para a apresentação e uso da ferramenta OpenSSL.

2.1. Introdução

Os objetivos para uso de criptografia de dados tem diversos contextos, ora para permitir que apenas um conjunto de usuários tenha acesso a uma determinada mensagem, ora para garantir a autenticidade de uma mensagem, entre outros.

Criptografar um dado, no nosso contexto de aplicação, significa embaralhar uma mensagem de forma que possamos seletivamente, de posse a uma chave ou senha específica, restaurá-la integralmente. A partir deste contexto identificamos dois elementos:

  • Chave Privada
  • Chave Pública

Chave privada e pública são recursos criptográficos que correspondem a variáveis de um algoritmo que possibilita o embaralhamento e restauração de informação. Para maiores informações vide: Criptografia de Chave Pública

2.2. Utilizando Chaves Criptográficas

Utilizando a ferramenta OpenSSL podemos criar um conjunto de chaves público e privada. Com elas poderemos verificar os mecanismos de criptografia, restauração e analisar mecanismos de distribuição de chaves.

2.2.1. Chave Privada

A execução do comando abaixo criará uma chave privada. Observe que utilizamos o algoritmo AES256 para definição de uma senha, com uma chave de 4096 bits. O arquivo gerado terá o nome A.private.key. Será solicitada uma senha de sua preferência. Utilizaremos: privateA.

openssl genrsa -aes256 -out A.private.key 4096

A imagem abaixo mostra as mensagens que a aplicação apresenta ao usuário:

Cripto_201.png

Figura 2.1. Geração de uma chave privada.

O arquivo gerado contém a chave privada criptografada pelo algoritmo solicitado. Parte de seu conteúdo é mostrado abaixo, pois ele apresenta 55 linhas:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,D6E76F15B42CCA5A252E1FA4B8F96A8D
gxGkvEnWRjx1XgIE5S2sqFwEh63d+ivQVJ9NhtGv5Q7xCbF8wZIQrXSt17e7qWNv
B3aHmRj3sIQDGlwq5g9RCmVeBEaYCkasXzpf9sz1swYhPJn+2AM8+1kdMt+kan06
Zlx7TvVDfxGIGpn8ci/YggsjVyxrMR0FUSTRceX+/fvmroRRVp4S3vw6gQItdGmI
...
GQAYMcDbIHTOma22VKjmlq1E1WnLqxbmYcPRYACGuSapHiLVMIuAFR5ets0jjlQw
TUvh7zANuBYtdi95kvdGko00oM0TmrwJ3tFUkUdKMDkGYiiC8EJxIny5LQX7dXPx
ZbNSWo8rGkw4whpUptbIrBGJCt43JzZH7/DuUttWag4zCr2AmoZrEj+mEEUrD6md
-----END RSA PRIVATE KEY-----

Chave Privada Sem Senha

Há a possibilidade de criar uma chave privada sem a necessidade de senha. Basta remover no comando anterior o parâmetro aes256. O conteúdo do arquivo não apresentará as linhas iniciadas com os termos Proc-Type e DEK-Info. Os comandos deixarão de solicitar a senha para os procedimento de criptografia e restauração.

2.2.2. Chave Pública

A execução do comando abaixo criará um arquivo para a chave pública extraída da chave privada recém criada. Será necessária a apresentação da senha da chave privada.

openssl rsa -in A.private.key -pubout -out A.public.key

Cripto_202.png

Figura 2.2. Geração da chave pública a partir da chave private.

O arquivo gerado contém a chave pública. Seu conteúdo é mostrado integralmente abaixo. Observe que o arquivo público gerado é muito menor daquele privado:

-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6SOhzqy4u/8WQYAZ6Zt5
EjiRZmCG8MaPIyFhCN7O/oliR1VqGLQ69cVAgW/XoLt+84NglRW4R3l6QzoMnHDd
rbrM/+cFEQ86nuz3FOHBNsX+2CwkPPERiQFRfS5SaQvQfrOi4gY6YyWAgAzIV6I6
1CT6UkHjQY/IQ/4M1dRTJ8BkAcItFP2vVgaZhfkA5A4wWeavw0gTPE45RfjV/JIv
GXn56jL2x7ZYtQx2L1JTOM4LXoEd1W08YmLri8nn18PNv4oizxC1M7928bYTbm8m
AUQixIN50cz9wt25t3f+bljWJzsl4myXIcxy7Mhz+kb8ds4W2XhTkXtUVeDclmYa
Cm+Fd4F6lJkOHdgx027xONY00xQxdyjMClDAQpnEs1Kma/8e0ZuIgWRtotSdeJXf
NKjg2+F1Nm3ZsmSQjKmlvO/Sn5dAiqI8uH4u6CXGoCaeMY7+mHRupnrtQSfyXYqD
+JYo9j6h+QznTbbznjq9230oKhahkoMv1ZR0itcSHDlww8ChlC5BfAI6MJKu+rd3
goZBKX3PxJwIS9rzg3fyunB33nk8pH4kLx6e5RM8Y1FBBoei4LeIBEqsYTblEslB
WDjGPP5dtR9FRpYV7sO9VVyEs6YjR6oQcNmwhGAy4Zeiyk9WZgLunoNY2sXIDeFJ
uH1eg4Ph8RhMrkan5lPZha8CAwEAAQ==
-----END PUBLIC KEY-----

2.2.3. Criptografar Mensagem com Chave Pública

De posse de chaves publica e privada podemos criptografar conteúdo. Crie um arquivo local de nome message.txt contendo uma mensagem. Uma forma rápida pela linha de comando é através de:

type con > message.txt

Digite o conteúdo do arquivo, no caso da imagem abaixo "I know cryptography", e finalize pressionado <CTRL-C>.

Cripto_203.png

Figura 2.3. Comando para criação de um arquivo

Vamos utilizar a chave pública para criptografar esse arquivo através do comando abaixo:

openssl rsautl -encrypt -inkey A.public.key -pubin -in message.txt -out message_crypt.txt

Ao finalizar o comando será criado o arquivo "message_crypt.txt". Note que seu conteúdo é do tipo binário.

Obs: Se o conteúdo do arquivo for maior que o tamanho da chave o comando ira exibir mensagem de erro. Essa é uma limitação do algoritmo.

É importante atentar que utilizamos a chave pública da entidade A para criptografar a mensagem. Essa informação será importante para compreender futuramente a troca de informações do protocolo SSL/TLS. Você não conseguirá descriptografar esta mensagem com a chave pública, ou seja, a mensagem permanecerá segura para quaisquer outra pessoa que tiver a mesma chave pública. Veremos em seguida que somente o possuidor da chave privada conseguirá descriptografá-la.

2.2.4. Descriptografar a Mensagem com a Chave Privada

De posse do arquivo criptografado utilizaremos a chave privada no comando abaixo:

openssl rsautl -decrypt -inkey A.private.key -in message_crypt.txt -out message_decrypt.txt

Ao finalizar o comando será criado o arquivo "message_decrypt.txt" com o conteúdo da mensagem restaurado para o modo texto.

Recordando: Neste momento temos segurança no envio da mensagem de uma entidade B (que possui a chave pública) para a entidade A (que possui a chave privada). Ambas as chaves foram geradas pela entidade A, sendo que a pública foi distribuída publicamente entre eles para a entidade B.

Cripto_204.png

Figura 2.4. Fluxo unidirecional de envio de mensagem segura

Para que a comunicação entre as entidades sejam integralmente segura há necessidade de garantir a criptografia na mensagem enviada pela entidade A para a entidade B. Abordaremos essa operação adiante no artigo.

2.2.5. Testes

É interessante realizarmos alguns testes associados as operações encrypt e decrypt do OpenSSL. O objetivo é tentar na prática sanar algumas dúvidas quanto aos procedimentos e informações anteriormente abordados.

Lembre-se, os testes neste ponto referem-se a um fluxo unidirecional tal como expresso na figura 2.4. Ao longo do artigo veremos, com o fluxo bidirecional em par de chaves, que há formas alternativas de sanar os problemas aqui apresentados.

Descriptografar com Chave Pública

Uma vez que criptografamos um conteúdo ou uma mensagem com uma chave pública apenas o detentor da chave privada poderá recompor a informação. Vamos tentar descriptografar uma mensagem com a chave publica:

openssl rsautl -decrypt -inkey A.public.key -pubin -in message_crypt.txt -out message_decrypt_pub.txt

O resultado da execução do comando indicará a necessidade da chave privada para executar a operação, conforme observado na figura abaixo:

Cripto_205.png

Figura 2.5. Erro no uso da opção decrypt com chave pública

Criptografar com Chave Privada

Criptografar uma mensagem com a chave privada faz com que seja somente possível a restauração da mensagem original através da mesma chave privada. Execute o comando abaixo:

openssl rsautl -encrypt -inkey A.private.key -in message.txt -out message_crypt_priv.txt

A execução deve retornar sucesso. Observe que o conteúdo dos dois arquivos criptografados, pela chave publica e agora pela chave privada, são bem diferentes.

Agora, tente descriptografar o mensagem privado utilizando a chave pública, através do mesmo comando outrora apresentado, porém, alterando o arquivo de entrada:

openssl rsautl -decrypt -inkey A.public.key -pubin -in message_crypt_priv.txt -out message_decrypt_priv.txt

A execução reportará o mesmo erro apresentado na figura 2.5, requerendo uma chave privada para a operação.

2.3. Processo Bidirecional de Criptografia

 

 

openssl rsautl -sign -inkey A.private.key -in message.txt -out message_crypt_priv.txt
openssl rsautl -inkey A.public.key -pubin -in message_crypt_priv.txt -out message_decrypt_pub.txt

 

2.4. Conclusão

Conceitos importantes para fixação:

  • A criptografia da mensagem é realizada a partir da chave pública da entidade A, enquanto a restauração do conteúdo é realizado a partir da chave privada da entidade A.
  • Caso uma entidade B queira enviar uma mensagem que somente seja lida pela entidade A, basta ter em mãos a chave pública de A, criptografar a mensagem e envia-la. Somente a entidade A poderá abrir o conteúdo criptografado.

 

3. Certificados Digitais

O objetivo deste tópico é apresentar os conceitos iniciais que envolvem os certificados digitais, entre eles seus modelos e formatos.

3.1. Introdução

Após compreendermos a utilização do recurso de criptografia e o conceito das chaves envolvidas, passamos a estudar as formas e alguns padrões de armazenamento e disponibilização possíveis.

O objetivo de utilizar certificados digitais nos processo de comunicação está associado a necessidade de estabelecer um canal de tráfego de informações segura. Envolve restringir o acesso as informações trocadas a apenas os pares conectados, quer sejam eles dois computadores, quer sejam dois roteadores (note que os roteadores podem permitir que mais de um usuário tenha acesso a informação).

3.2. Certificados

Certificados digitais são instrumentos lógicos utilizados em procedimentos onde deseja-se a verificação de autenticidade dos entes envolvidos, servidores e clientes, ou seja, uma forma de assinatura física sob o formato digital. Essa autenticidade pode ser referida pela verificação de acesso através de login, verificação de produção de um conteúdo através de uma assinatura digital, transferência de informações criptografadas, entre outros.

Os protocolos de comunicação seguros fazem uso de certificados digitais para, através da autenticidade entre usuários, criar um procedimento que permita um alto grau de segurança contra invasões e vazamentos de informações.

Um certificado refere-se a um arquivo digital composto por um conjunto de informações especificadas por uma norma, por exemplo o X509. A norma define campos de dados obrigatórios e opcionais processados ou criptografados pelas chaves criptográficas, privadas e públicas, das entidades envolvidas. Por exemplo, em um servidor de conteúdo é importante que o certificado digital contenha a informação de domínio, ou subdomínio, que o servidor está hosteando, tech.catroque.com.br.

Cripto_301.png

Figura 3.1. Certificado e chave privada compondo um par criptográfico

Chamamos de par criptográfico a composição de um certificado digital e uma chave privada correspondente a uma entidade. No certificado digital temos disponível a chave pública e um conjunto de informações que identificam a entidade, como nome do servidor, email, domínio, entre outros.

Certificado e Chave Pública

A informação importante neste ponto é compreender que em um certificado digital é um arquivo com um conjunto de dados onde a chave pública está disponível para leitura e uso nos procedimentos de segurança.