Cryptage du trafic TLS selon les algorithmes GOST-2012 avec Stunnel


Dans cet article, je veux montrer comment configurer Stunnel pour utiliser des algorithmes cryptographiques russes dans le protocole TLS. En prime, je montrerai comment chiffrer un canal TLS en utilisant des algorithmes GOST implémentés dans le cœur de chiffrement Rutoken EDS 2.0.


Mais d'abord, découvrons à quoi sert Stunnel. En un mot - c'est un programme sur lequel vous pouvez déplacer toute la logique du chiffrement du trafic entre le serveur et le client. Cela se fait comme suit: supposons que vous ayez un client et un serveur qui communiquent entre eux sans utiliser de chiffrement, d'authentification et de vérification d'intégrité. Vous pouvez réécrire le client et le serveur afin que tous les messages sortants et entrants soient transmis entre eux, en tenant compte de tous ces points, mais pourquoi de telles difficultés, si vous pouvez simplement le déplacer sur les épaules d'une autre application? Pour résoudre ce problème, Stunnel est parfait.


Vous avez juste besoin de configurer le client pour que tout son trafic soit transmis au client Stunnel, à son tour, il établit une connexion sécurisée au serveur, envoyant des données au serveur Stunnel. Stunnel sur le serveur déchiffre le trafic entrant et redirige les données vers l'entrée du serveur. Ce qui précède est plus facile à réaliser en regardant ce diagramme.



Il convient de noter que le serveur n'a pas besoin d'être exactement Stunnel pour fonctionner avec des algorithmes cryptographiques. C'est formidable qu'il existe des stands de démonstration prêts à l'emploi qui prennent en charge la cryptographie russe, dont la liste est dans la présentation avec RusCrypto'2019 .


Nous avons besoin de serveurs stables qui fournissent une authentification bidirectionnelle.
Nous avons sélectionné les serveurs CryptoPro comme les plus fiables avec la mise en œuvre complète de la norme GOST TLS. Merci à eux pour ça :)


Cela semble assez simple, essayons d'organiser ce processus.


Étape préparatoire


Nous aurons besoin de:


  1. Openssl
  2. Stunnel
  3. rtengine
  4. Accès aux serveurs de test CryptoPro pour vérifier la connexion TLS

OpenSSL pour Windows peut être récupéré à partir d'ici et pour les utilisateurs de Linux - à partir de référentiels ou collecté en téléchargeant la dernière version à partir d'ici . Elle peut également être extraite du SDK Rutoken , du répertoire openssl \ openssl-tool-1.1 , cette archive nous sera utile davantage, car il contient la gamme qui nous intéresse. Stunnel peut être trouvé ici . La version> = 5.56 est requise pour le fonctionnement.


Vous pouvez télécharger rtengine à partir du SDK Rutoken , il se trouve dans le répertoire openssl \ rtengine \ bin . Vous devez le déposer là où tous les moteurs openssl sont stockés. Vous pouvez trouver le chemin vers eux en utilisant


openssl.exe version -a 

Mais il ne suffit pas de déplacer le moteur vers le dossier souhaité; vous devez toujours configurer openssl lui-même pour fonctionner avec. Nous découvrons où se trouve le fichier de configuration openssl.cnf avec la même commande que ci-dessus (sous le stunnel Windows est livré avec sa propre version de openssl, donc le fichier de configuration se trouve dans le chemin \ to \ stunnel \ config \ openssl.cnf


 #   : openssl_conf = openssl_def ... #   : # OpenSSL default section [openssl_def] engines = engine_section [engine_section] rtengine = rtengine_section [rtengine_section] engine_id = rtengine dynamic_path = /path/to/rtengine.so MODULE_PATH = /usr/lib/librtpkcs11ecp.so default_algorithms = CIPHERS, DIGEST, PKEY, RAND 

Vérifions que rtengine est connecté, pour cela nous connectons un token et listons tous les algorithmes de cryptage:


 openssl ciphers -v 

Permettez-moi de vous rappeler que dans Windows, vous devez vérifier pour openssl, qui se trouve à côté de stunnel
Si parmi eux nos GOST seront présents, alors tout est correctement configuré.


Le moment est venu pour le plus intéressant: vérifier la connexion avec les serveurs de test GOST CryptoPro. Une liste de ces serveurs est décrite ici ( https://www.cryptopro.ru/products/csp/tc26tls ). Chacun de ces serveurs fonctionne avec ses propres algorithmes d'authentification et de chiffrement. De plus, sur les ports 443, 1443, 2443, ... des services sont lancés qui n'acceptent que certains paramètres. Ainsi, par exemple, sur http://tlsgost-256auth.cryptopro.ru , le cryptage est effectué avec authentification à l'aide des algorithmes GOST2012-GOST8912-GOST8912 et d'une clé de 256 bits. De plus, le port 443 utilise XchA-ParamSet, le port 1443 utilise XchB-ParamSet, le port 2443 utilise A-ParamSet, etc.


Maintenant que nous savons de quelle clé nous avons besoin, récupérons le certificat racine du serveur de test, établissons les clés de travail et signons la demande de notre certificat.


Manière simple (fonctionne sous Windows et Linux)


  1. Pour obtenir le certificat racine, nous allons nous rendre sur le site du test CA LLC "CRIPTO-PRO" . Et cliquez sur le bouton pour obtenir un certificat. Un nouvel onglet apparaîtra, sur lequel vous devrez sélectionner la méthode de cryptage Base64 et cliquer sur le bouton "Télécharger le certificat CA" . Le fichier certnew.cer résultant est enregistré.
  2. Suivez le lien . Installez tous les plugins qui nous sont demandés. Nous cliquons sur le bouton "Créer une clé" , et sélectionnons l'algorithme "GOST R 34.10-2012 256 bits" pour la génération. Ensuite, créez une demande de certificat, dans la colonne "Application" vous pouvez tout sélectionner. Dans la colonne Application supplémentaire: Authentification client et utilisateur du centre d'inscription CryptoPro.
  3. Nous ouvrons à nouveau le site de l'AC de test, mais cette fois nous cliquons sur le bouton "Envoyer la demande prête PKCS # 10 ou PKCS # 7 encodée en Base64" . Nous collons le contenu de notre demande dans le champ, cliquons sur le bouton «Issue» et chargeons le certificat user.crt au format Base64. Le fichier résultant est enregistré.

Via la ligne de commande


  1. Pour obtenir le certificat racine, nous allons nous rendre sur le site du test CA LLC "CRIPTO-PRO" . Et cliquez sur le bouton pour obtenir un certificat. Un nouvel onglet apparaîtra, dans lequel vous devrez sélectionner la méthode de cryptage Base64 et cliquer sur le bouton "Télécharger le certificat CA" . Le fichier certnew.cer résultant est enregistré.


  2. Générez maintenant les clés.


     pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type GOSTR3410-2012-256:B -l --id 45 # 45 --   ASII id  (E) 

    Il convient de noter que les clés générées sur le jeton ne peuvent pas être copiées à partir du jeton. C'est l'un des principaux avantages de leur utilisation.


  3. Créez une demande de certificat:


     openssl req -engine rtengine -new -key="pkcs11:id=E" -keyform engine -out client.req 

  4. Nous ouvrons à nouveau le site de l'AC de test, mais cette fois nous cliquons sur le bouton "Envoyer la demande prête PKCS # 10 ou PKCS # 7 encodée en Base64" . Nous collons le contenu de notre demande dans le champ, cliquez sur le bouton Émettre et téléchargeons le certificat user.crt au format Base64. Le fichier résultant est enregistré.



Il y avait la dernière question: pourquoi tout ça ??? Pourquoi avons-nous obtenu tous ces certificats, clés et demandes?


Le fait est qu'ils sont nécessaires au protocole TLS pour l'authentification bidirectionnelle. Cela fonctionne très simplement.


Nous avons un certificat de serveur et nous le considérons comme fiable.


Notre client vérifie que le serveur avec lequel nous travaillons possède un certificat similaire.
Le serveur veut s'assurer qu'il fonctionne avec l'utilisateur qu'il connaît. Pour cela, nous avons créé une demande de certificat pour travailler à travers nos clés.


Nous avons envoyé cette demande et le serveur l'a signée avec sa signature numérique. Nous pouvons maintenant présenter ce certificat à chaque fois, signé par l'autorité de certification racine, confirmant ainsi que nous sommes nous.


Configuration de Stunnel


Il ne reste plus qu'à configurer correctement notre tunnel. Pour ce faire, créez un fichier stunnel.conf avec les paramètres Stunnel par défaut et écrivez ce qui suit:


 ;      - debug = 7 output = /path/to/stunnel.log ;    TLSv1 sslVersion=TLSv1 ;  . engine=rtengine ;     [remote system] client=yes ;  engine,     engineId=rtengine ;   2 (  ) verify = 2 ;     CAFile = /path/to/certnew.cer ;     cert=/path/to/user.crt ;     . key=pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;id=E ;   Stunnel      accept = localhost:8080 connect = tlsgost-256auth.cryptopro.ru:2443 

Maintenant, si tout est fait correctement, vous pouvez démarrer Stunnel avec notre configuration et vous connecter au serveur:


 stunnel.exe /path/to/stunnel.conf 

Ouvrez le navigateur et accédez à localhost: 8080. Si tout est correct, les informations suivantes s'affichent:



Sinon, nous examinons les journaux et utilisons le débogueur pour comprendre quel est le problème.


Si vous avez des questions, n'hésitez pas à commenter :)

Source: https://habr.com/ru/post/fr477650/


All Articles