Expérience dans l'utilisation de la technologie Rutoken pour enregistrer et autoriser les utilisateurs dans le système (partie 1)

Bon après-midi Je souhaite partager mon expérience sur ce sujet.

Rutoken est une solution matérielle et logicielle dans le domaine de l'authentification, de la sécurité de l'information et de la signature électronique. Il s'agit essentiellement d'un lecteur flash capable de stocker les données d'authentification que l'utilisateur utilise pour se connecter au système.

Dans cet exemple, Rutoken EDS 2.0 est utilisé.

Pour travailler avec ce Rutoken, vous avez besoin installer le pilote sur Windows.

Pour Windows, l'installation d'un seul pilote garantit que tout ce qui est nécessaire est installé pour que le système d'exploitation voie votre Rutoken et puisse l'utiliser.

Vous pouvez interagir avec Rutoken de différentes manières. Vous pouvez y accéder depuis le côté serveur de l'application, ou directement depuis le côté client. Cet exemple examinera l'interaction avec Rutoken du côté client de l'application.

La partie client de l'application interagit avec le rutoken via le plugin rutoken. Il s'agit d'un programme installé séparément sur chaque navigateur. Pour Windows il vous suffit de télécharger et d'installer le plugin, situé sur ce lien.

Ça y est, nous pouvons maintenant interagir avec Rutoken depuis le côté client de l'application.

Cet exemple discute de l'idée d'implémenter un algorithme d'autorisation des utilisateurs dans le système en utilisant le schéma défi-réponse.

L'essence de l'idée est la suivante :

  1. Le client envoie une demande d'autorisation au serveur.
  2. Le serveur répond à une requête du client en envoyant une chaîne aléatoire.
  3. Le client complète cette chaîne avec 32 bits aléatoires.
  4. Le client signe la chaîne reçue avec son certificat.
  5. Le client envoie le message crypté reçu au serveur.
  6. Le serveur vérifie la signature en recevant le message original non crypté.
  7. Le serveur supprime les 32 derniers bits du message non chiffré reçu.
  8. Le serveur compare le résultat reçu avec le message envoyé lors de la demande d'autorisation.
  9. Si les messages sont identiques, l'autorisation est considérée comme réussie.

Dans l'algorithme ci-dessus, il existe un certificat. Pour cet exemple, vous devez comprendre une certaine théorie cryptographique. Sur Habré, il y a super article sur ce sujet.

Dans cet exemple, nous utiliserons des algorithmes de chiffrement asymétriques. Pour implémenter des algorithmes asymétriques, vous devez disposer d’une bi-clé et d’un certificat.

Une paire de clés se compose de deux parties : une clé privée et une clé publique. La clé privée, comme son nom l’indique, doit être secrète. Nous l'utilisons pour décrypter les informations. La clé publique peut être distribuée à n'importe qui. Cette clé est utilisée pour crypter les données. Ainsi, n’importe quel utilisateur peut chiffrer les données à l’aide de la clé publique, mais seul le propriétaire de la clé privée peut déchiffrer ces informations.

Un certificat est un document électronique qui contient des informations sur l'utilisateur propriétaire du certificat, ainsi qu'une clé publique. Avec un certificat, l'utilisateur peut signer n'importe quelle donnée et l'envoyer au serveur, qui peut vérifier la signature et décrypter les données.

Afin de signer correctement un message avec un certificat, vous devez le créer correctement. Pour ce faire, une bi-clé est d'abord créée sur Rutoken, puis un certificat doit être lié à la clé publique de cette bi-clé. Le certificat doit avoir exactement la clé publique qui se trouve sur Rutoken, c'est important. Si nous créons simplement une paire de clés et un certificat immédiatement du côté client de l'application, comment le serveur peut-il ensuite déchiffrer ce message crypté ? Après tout, il ne sait rien du tout ni de la paire de clés ni du certificat.

Si vous approfondissez ce sujet, vous pourrez trouver des informations intéressantes sur Internet. Il existe certaines autorités de certification en qui nous avons évidemment confiance. Ces autorités de certification peuvent délivrer des certificats aux utilisateurs ; elles installent ces certificats sur leur serveur. Après cela, lorsque le client accède à ce serveur, il voit ce même certificat et voit qu'il a été émis par une autorité de certification, ce qui signifie que ce serveur peut être fiable. Il existe également de nombreuses informations sur Internet sur la façon de tout configurer correctement. Par exemple, vous pouvez commencer par ceci.

Si l’on revient à notre problème, la solution semble évidente. Vous devez en quelque sorte créer votre propre centre de certification. Mais avant cela, vous devez déterminer sur quelle base le centre de certification doit délivrer un certificat à l'utilisateur, car il n'en sait rien. (Par exemple, son prénom, son nom, etc.) Il existe ce qu'on appelle une demande de certificat. De plus amples informations sur cette norme peuvent être trouvées, par exemple, sur Wikipedia ru.wikipedia.org/wiki/PKCS
Nous utiliserons la version 1.7 - PKCS#10.

Décrivons l'algorithme de génération d'un certificat sur Rutoken (source originale : documentation):

  1. Nous créons une paire de clés sur le client et la sauvegardons sur Rutoken. (la sauvegarde s'effectue automatiquement)
  2. Nous créons une demande de certificat sur le client.
  3. Du client, nous envoyons cette demande au serveur.
  4. Lorsque nous recevons une demande de certificat sur le serveur, nous émettons un certificat de notre autorité de certification.
  5. Nous envoyons ce certificat au client.
  6. Nous sauvegardons le certificat Rutoken sur le client.
  7. Le certificat doit être lié à la paire de clés créée lors de la première étape.

Il devient désormais clair comment le serveur pourra déchiffrer la signature du client, puisqu'il lui a lui-même délivré le certificat.

Dans la partie suivante, nous examinerons de plus près comment configurer votre autorité de certification basée sur la bibliothèque de cryptographie open source à part entière openSSL.

Source: habr.com

Ajouter un commentaire