Bom dia! Gostaria de compartilhar minha experiência sobre este tema.
Rutoken é uma solução de hardware e software na área de autenticação, proteção de informações e assinatura eletrônica. Na essência, é um pen drive que pode armazenar dados de autenticação que o usuário utiliza para acessar o sistema.
Neste exemplo, é utilizado o Rutoken ECP 2.0.
Para trabalhar com este Rutoken, é necessário.
Para Windows, a instalação apenas do driver garante que tudo o que é necessário seja instalado, para que o sistema operacional reconheça seu Rutoken e com ele seja possível trabalhar.
Com o Rutoken, é possível interagir de várias maneiras. Pode-se acessar o dispositivo a partir da parte servidor do aplicativo ou diretamente da parte cliente. Neste exemplo, será analisada a interação com o Rutoken a partir da parte cliente do aplicativo.
A parte cliente do aplicativo interage com o Rutoken através de um plugin Rutoken. Este é um programa que deve ser instalado separadamente em cada navegador. Para Windows, basta baixar e instalar o plugin, .
Tudo certo, agora podemos interagir com o Rutoken a partir da parte cliente do aplicativo.
Neste exemplo, é considerada a ideia de implementação de um algoritmo de autenticação do usuário no sistema utilizando o esquema challenge-response.
A essência da ideia é a seguinte:
- O cliente envia uma solicitação de autenticação para o servidor.
- O servidor, em resposta à solicitação do cliente, envia uma string aleatória.
- O cliente complementa essa string com 32 bits aleatórios.
- O cliente assina a string recebida com seu certificado.
- O cliente envia para o servidor a mensagem codificada recebida.
- O servidor verifica a assinatura, recebendo a mensagem original não codificada.
- O servidor separa os últimos 32 bits da mensagem não codificada recebida.
- O servidor compara o resultado obtido com a mensagem que foi enviada na solicitação de autenticação.
- Se as mensagens forem iguais, a autenticação é considerada bem-sucedida.
No algoritmo acima, há um conceito de certificado. No contexto deste exemplo, é necessário entender um pouco de teoria criptográfica. No Habr, há .
Neste exemplo, usaremos algoritmos de criptografia assimétrica. Para implementar algoritmos assimétricos, é necessário ter um par de chaves e um certificado.
O par de chaves consiste em duas partes: a chave privada e a chave pública. A chave privada, como o nome sugere, deve ser mantida em segredo. Usamos ela para descriptografar informações. A chave pública pode ser compartilhada livremente. Essa chave é utilizada para criptografar dados. Assim, qualquer usuário pode criptografar dados usando a chave pública, mas somente o proprietário da chave privada pode descriptografar essa informação.
Um certificado é um documento eletrônico que contém informações sobre o usuário a quem pertence o certificado, bem como a chave pública. Com um certificado, o usuário pode assinar qualquer dado e enviá-lo ao servidor, que pode verificar essa assinatura e descriptografar os dados.
Para que seja possível assinar corretamente uma mensagem com o certificado, é necessário criá-lo adequadamente. Para isso, primeiro é criado um par de chaves no RUTOKEN, e depois o certificado deve estar vinculado à chave pública desse par. O certificado deve conter exatamente a chave pública que está no RUTOKEN, isso é importante. Se criarmos simplesmente um par de chaves e um certificado diretamente na parte do cliente da aplicação, como o servidor poderá descriptografar essa mensagem criptografada? Afinal, ele não sabe nada sobre o par de chaves ou o certificado.
Se mergulharmos mais fundo nesse tema, podemos encontrar informações interessantes na internet. Existem alguns centros de certificação que confiamos por princípio. Esses centros de certificação podem emitir certificados para os usuários, e eles instalam esses certificados em seus servidores. Depois disso, quando um cliente se conecta a esse servidor, ele vê esse certificado e percebe que foi emitido pelo centro de certificação, o que significa que pode confiar nesse servidor. Há muita informação na internet sobre como configurá-lo corretamente. .
Se voltarmos à nossa tarefa, a solução parece óbvia. Precisamos, de alguma forma, criar nosso próprio centro de certificação. Mas antes disso, precisamos entender com base em que o centro de certificação deve emitir um certificado para o usuário, uma vez que ele não sabe nada sobre ele (por exemplo, seu nome, sobrenome etc.). Existe uma coisa chamada solicitação de certificado. Você pode conferir mais sobre esse padrão, por exemplo, na Wikipédia.
Vamos usar a versão 1.7 — PKCS#10.
Descreveremos o algoritmo para a formação do certificado no Rutoken (fonte original — ):
- No cliente, criamos um par de chaves e o salvamos no Rutoken. (o armazenamento acontece automaticamente)
- No cliente, criamos uma solicitação de certificado.
- Enviamos essa solicitação do cliente para o servidor.
- Ao receber a solicitação de certificado no servidor, emitimos o certificado pelo nosso centro de certificação.
- Enviamos esse certificado para o cliente.
- No cliente, salvamos o certificado no Rutoken.
- O certificado deve ser vinculado ao par de chaves que foi criado na primeira etapa.
Agora fica claro como o servidor conseguirá decifrar a assinatura do cliente, uma vez que ele mesmo emitiu o certificado.
Na próxima parte, vamos examinar detalhadamente como configurar nosso próprio centro de certificação com base em uma biblioteca criptográfica de código aberto chamada openSSL.
Fonte: habr.com
