Cifrado del tráfico TLS según los algoritmos GOST-2012 con Stunnel


En este artículo quiero mostrar cómo configurar Stunnel para usar algoritmos criptográficos rusos en el protocolo TLS. Como beneficio adicional, le mostraré cómo cifrar un canal TLS utilizando algoritmos GOST implementados en el núcleo de cifrado Rutoken EDS 2.0.


Pero primero, descubramos para qué sirve Stunnel. En pocas palabras: este es un programa en el que puede cambiar toda la lógica del cifrado de tráfico entre el servidor y el cliente. Esto se hace de la siguiente manera: suponga que tiene un cliente y un servidor que se comunican entre sí sin usar cifrado, autenticación y verificación de integridad. Podría reescribir el cliente y el servidor para que todos los mensajes salientes y entrantes se transmitan entre ellos, teniendo en cuenta todos estos puntos, pero ¿por qué tantas dificultades si simplemente puede pasarlo a los hombros de otra aplicación? Para resolver este problema, Stunnel es perfecto.


Solo necesita configurar el cliente para que todo su tráfico se transmita al cliente Stunnel, a su vez, establece una conexión segura al servidor, enviando datos al servidor Stunnel. Stunnel en el servidor descifra el tráfico entrante y redirige los datos a la entrada del servidor. Lo anterior es más fácil de realizar mirando este diagrama.



Vale la pena señalar que el servidor no tiene que ser exactamente Stunnel, para trabajar con algoritmos criptográficos. Es genial que haya stands de demostración ya preparados que admitan la criptografía rusa, cuya lista se encuentra en la presentación con RusCrypto'2019 .


Necesitamos servidores estables que proporcionen autenticación bidireccional.
Hemos elegido los servidores CryptoPro como los más confiables con la implementación completa del estándar GOST TLS. Gracias a ellos por eso :)


Suena bastante simple, intentemos organizar este proceso.


Paso preparatorio


Necesitaremos:


  1. Openssl
  2. Stunnel
  3. rtengine
  4. Acceso a servidores de prueba CryptoPro para verificar la conexión TLS

OpenSSL para Windows se puede tomar desde aquí , y para usuarios de Linux, desde repositorios, o ensamblarlo descargando la última versión desde aquí . También se puede tomar del SDK de Rutoken , del directorio openssl \ openssl-tool-1.1 , este archivo nos será más útil, ya que Contiene la rtengine que nos interesa. Stunnel se puede encontrar aquí . Se requiere una versión> = 5.56 para la operación.


Puede descargar rtengine del SDK de Rutoken , se encuentra en el directorio openssl \ rtengine \ bin . Debe soltarlo donde se almacenan todos los motores openssl. Puedes encontrar el camino hacia ellos usando


openssl.exe version -a 

Pero no basta con mover el motor a la carpeta deseada; aún necesita configurar openssl para trabajar con él. Descubrimos dónde se encuentra el archivo de configuración openssl.cnf con el mismo comando que el anterior (en Windows stunnel viene con su propia versión de openssl, por lo que el archivo de configuración se encuentra en la ruta \ 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 

Verifiquemos que rtengine esté conectado, para esto conectamos un token y enumeramos todos los algoritmos de cifrado:


 openssl ciphers -v 

Permítame recordarle que en Windows debe verificar si hay openssl, que se encuentra junto a stunnel
Si entre ellos nuestros GOST estarán presentes, entonces todo está configurado correctamente.


Ha llegado el momento de lo más interesante: comprobar la conexión con los servidores de prueba GOST CryptoPro. Aquí se describe una lista de estos servidores ( https://www.cryptopro.ru/products/csp/tc26tls ). Cada uno de estos servidores funciona con sus propios algoritmos de autenticación y encriptación. Además, en los puertos 443, 1443, 2443, ... se lanzan servicios que solo aceptan ciertos parámetros. Entonces, por ejemplo, en http://tlsgost-256auth.cryptopro.ru , el cifrado se realiza con autenticación utilizando los algoritmos GOST2012-GOST8912-GOST8912 y una clave de 256 bits. Además, el puerto 443 usa XchA-ParamSet, el puerto 1443 usa XchB-ParamSet, el puerto 2443 usa A-ParamSet, etc.


Ahora que sabemos qué clave necesitamos, obtengamos el certificado raíz del servidor de prueba, busquemos las claves para el trabajo y firmemos la solicitud de nuestro certificado.


Forma simple (funciona bajo Windows y Linux)


  1. Para obtener el certificado raíz, iremos al sitio de la prueba de CA LLC "CRIPTO-PRO" . Y haga clic en el botón para obtener un certificado. Aparecerá una nueva pestaña, en la que deberá seleccionar el método de cifrado Base64 y hacer clic en el botón "Descargar certificado CA" . El archivo certnew.cer resultante se guarda.
  2. Sigue el enlace . Instale todos los complementos que nos soliciten. Hacemos clic en el botón "Crear clave" y seleccionamos el algoritmo "GOST R 34.10-2012 256-bit" para la generación. A continuación, cree una solicitud de certificado, en la columna "Aplicación" puede seleccionar todo. En la columna Aplicación adicional: Autenticación del cliente y usuario del Centro de registro de CryptoPro.
  3. Nuevamente abrimos el sitio de la CA de prueba, pero esta vez hacemos clic en el botón "Enviar solicitud preparada PKCS # 10 o PKCS # 7 codificado en Base64" . Pegamos el contenido de nuestra solicitud en el campo, hacemos clic en el botón "Emitir" y cargamos el certificado user.crt en formato Base64. El archivo resultante se guarda.

Vía linea de comando


  1. Para obtener el certificado raíz, iremos al sitio de la prueba de CA LLC "CRIPTO-PRO" . Y haga clic en el botón para obtener un certificado. Aparecerá una nueva pestaña, en la que deberá seleccionar el método de cifrado Base64 y hacer clic en el botón "Descargar certificado CA" . El archivo certnew.cer resultante se guarda.


  2. Ahora genera las claves.


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

    Vale la pena señalar que las claves generadas en el token no se pueden copiar del token. Esta es una de las principales ventajas de su uso.


  3. Crear una solicitud de certificado:


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

  4. Nuevamente abrimos el sitio de la CA de prueba, pero esta vez hacemos clic en el botón "Enviar solicitud preparada PKCS # 10 o PKCS # 7 codificado en Base64" . Pegamos el contenido de nuestra solicitud en el campo, hacemos clic en el botón Emitir y cargamos el certificado user.crt en formato Base64. El archivo resultante se guarda.



Hubo la última pregunta: ¿Por qué es todo esto? ¿Por qué obtuvimos todos estos certificados, claves y solicitudes?


El hecho es que el protocolo TLS los necesita para la autenticación bidireccional. Funciona de manera muy simple.


Tenemos un certificado de servidor y lo consideramos confiable.


Nuestro cliente verifica que el servidor con el que estamos trabajando tenga un certificado similar.
El servidor quiere asegurarse de que funciona con el usuario que conoce. Para esto, creamos una solicitud de certificado para trabajar con nuestras claves.


Enviamos esta solicitud y el servidor la firmó con su firma digital. Ahora podemos presentar este certificado cada vez, firmado por la CA raíz, lo que confirma que somos nosotros.


Configurando Stunnel


Solo queda configurar adecuadamente nuestro túnel. Para hacer esto, cree un archivo stunnel.conf con la configuración predeterminada de Stunnel y escriba lo siguiente allí:


 ;      - 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 

Ahora, si todo se hace correctamente, puede iniciar Stunnel con nuestra configuración y conectarse al servidor:


 stunnel.exe /path/to/stunnel.conf 

Abra el navegador y vaya a localhost: 8080. Si todo está correcto, se mostrará lo siguiente:



Si no, miramos los registros y usamos el depurador para comprender cuál es el problema.


Si tiene alguna pregunta, puede comentar :)

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


All Articles