Experiência na utilização da tecnologia Rutoken para cadastro e autorização de usuários no sistema (parte 1)

Boa tarde Quero compartilhar minha experiência neste assunto.

Rutoken é uma solução de hardware e software na área de autenticação, segurança da informação e assinatura eletrônica. Essencialmente, esta é uma unidade flash que pode armazenar dados de autenticação que o usuário usa para fazer login no sistema.

Neste exemplo, Rutoken EDS 2.0 é usado.

Para trabalhar com este Rutoken você precisa instalar driver no windows.

Para Windows, a instalação de apenas um driver garante que tudo o que é necessário esteja instalado para que o sistema operacional veja o seu Rutoken e possa trabalhar com ele.

Você pode interagir com Rutoken de várias maneiras. Você pode acessá-lo do lado do servidor do aplicativo ou diretamente do lado do cliente. Este exemplo examinará a interação com Rutoken do lado do cliente do aplicativo.

A parte cliente do aplicativo interage com o rutoken por meio do plugin rutoken. Este é um programa instalado separadamente em cada navegador. Para Windows você só precisa baixar e instalar o plugin, localizado neste link.

É isso, agora podemos interagir com o Rutoken do lado cliente da aplicação.

Este exemplo discute a ideia de implementar um algoritmo de autorização de usuário no sistema usando o esquema desafio-resposta.

A essência da ideia é a seguinte:

  1. O cliente envia uma solicitação de autorização ao servidor.
  2. O servidor responde a uma solicitação do cliente enviando uma string aleatória.
  3. O cliente preenche essa string com 32 bits aleatórios.
  4. O cliente assina a string recebida com seu certificado.
  5. O cliente envia a mensagem criptografada recebida ao servidor.
  6. O servidor verifica a assinatura recebendo a mensagem original não criptografada.
  7. O servidor remove os últimos 32 bits da mensagem não criptografada recebida.
  8. O servidor compara o resultado recebido com a mensagem que foi enviada ao solicitar autorização.
  9. Se as mensagens forem iguais, a autorização será considerada bem-sucedida.

No algoritmo acima existe um certificado. Para este exemplo, você precisa entender um pouco da teoria criptográfica. Em Habré há ótimo artigo sobre esse assunto.

Neste exemplo, usaremos algoritmos de criptografia assimétrica. Para implementar algoritmos assimétricos, você deve ter um par de chaves e um certificado.

Um par de chaves consiste em duas partes: uma chave privada e uma chave pública. A chave privada, como o próprio nome sugere, deve ser secreta. Nós o usamos para descriptografar informações. A chave pública pode ser distribuída a qualquer pessoa. Esta chave é usada para criptografar dados. Assim, qualquer usuário pode criptografar dados utilizando a chave pública, mas apenas o dono da chave privada pode descriptografar esta informação.

Um certificado é um documento eletrônico que contém informações sobre o usuário proprietário do certificado, bem como uma chave pública. Com um certificado, o usuário pode assinar quaisquer dados e enviá-los ao servidor, que pode verificar a assinatura e descriptografar os dados.

Para assinar corretamente uma mensagem com um certificado, você precisa criá-lo corretamente. Para fazer isso, primeiro é criado um par de chaves no Rutoken e, em seguida, um certificado deve ser vinculado à chave pública desse par de chaves. O certificado deve conter exatamente a chave pública que está localizada no Rutoken, isso é importante. Se simplesmente criarmos um par de chaves e um certificado imediatamente no lado do cliente do aplicativo, como o servidor poderá descriptografar essa mensagem criptografada? Afinal, ele não sabe absolutamente nada sobre o par de chaves ou sobre o certificado.

Se você se aprofundar neste tópico, poderá encontrar informações interessantes na Internet. Existem certas autoridades de certificação nas quais obviamente confiamos. Essas autoridades de certificação podem emitir certificados para usuários; elas instalam esses certificados em seus servidores. Depois disso, quando o cliente acessa este servidor, ele vê este mesmo certificado, e vê que foi emitido por uma autoridade certificadora, o que significa que este servidor é confiável. Também há muitas informações na Internet sobre como configurar tudo corretamente. Por exemplo, você pode começar com isso.

Se voltarmos ao nosso problema, a solução parece óbvia. Você precisa de alguma forma criar seu próprio centro de certificação. Mas antes é preciso saber com que base o centro de certificação deve emitir um certificado para o usuário, pois ele não sabe nada sobre isso. (Por exemplo, seu nome, sobrenome, etc.) Existe uma coisa chamada solicitação de certificado. Mais informações sobre este padrão podem ser encontradas, por exemplo, na Wikipedia ru.wikipedia.org/wiki/PKCS
Usaremos a versão 1.7 - PKCS#10.

Descrevemos o algoritmo para gerar um certificado no Rutoken (fonte original: a documentação):

  1. Criamos um par de chaves no cliente e salvamos no Rutoken. (o salvamento ocorre automaticamente)
  2. Criamos uma solicitação de certificado no cliente.
  3. Do cliente enviamos esta solicitação para o servidor.
  4. Quando recebemos uma solicitação de certificado no servidor, emitimos um certificado de nossa autoridade de certificação.
  5. Enviamos este certificado ao cliente.
  6. Salvamos o certificado Rutoken no cliente.
  7. O certificado deve estar vinculado ao par de chaves criado na primeira etapa.

Agora fica claro como o servidor conseguirá descriptografar a assinatura do cliente, já que ele próprio emitiu o certificado para ele.

Na próxima parte, veremos mais de perto como configurar sua autoridade de certificação com base na biblioteca de criptografia de código aberto openSSL completa.

Fonte: habr.com

Adicionar um comentário