Experiencia en el uso de la tecnología Rutoken para el registro y autorización de usuarios en el sistema (parte 1)

Buenas tardes Quiero compartir mi experiencia sobre este tema.

Rutoken son soluciones de hardware y software en el campo de la autenticación, seguridad de la información y firma electrónica. Básicamente, se trata de una unidad flash que puede almacenar datos de autenticación que el usuario utiliza para iniciar sesión en el sistema.

En este ejemplo, se utiliza Rutoken EDS 2.0.

Para trabajar con este Rutoken necesitas instalar el controlador en windows.

Para Windows, instalar un solo controlador garantiza que todo lo necesario esté instalado para que el sistema operativo vea su Rutoken y pueda trabajar con él.

Puedes interactuar con Rutoken de varias maneras. Puede acceder a él desde el lado del servidor de la aplicación o directamente desde el lado del cliente. Este ejemplo analizará la interacción con Rutoken desde el lado del cliente de la aplicación.

La parte cliente de la aplicación interactúa con el rutoken a través del complemento rutoken. Este es un programa que se instala por separado en cada navegador. Para Windows sólo necesitas descargar e instalar el complemento, ubicado en este enlace.

Eso es todo, ahora podemos interactuar con Rutoken desde el lado cliente de la aplicación.

Este ejemplo analiza la idea de implementar un algoritmo de autorización de usuario en el sistema utilizando el esquema de desafío-respuesta.

La esencia de la idea es la siguiente:

  1. El cliente envía una solicitud de autorización al servidor.
  2. El servidor responde a una solicitud del cliente enviando una cadena aleatoria.
  3. El cliente rellena esta cadena con 32 bits aleatorios.
  4. El cliente firma la cadena recibida con su certificado.
  5. El cliente envía el mensaje cifrado recibido al servidor.
  6. El servidor verifica la firma al recibir el mensaje original sin cifrar.
  7. El servidor elimina los últimos 32 bits del mensaje no cifrado recibido.
  8. El servidor compara el resultado recibido con el mensaje que se envió al solicitar autorización.
  9. Si los mensajes son iguales, entonces la autorización se considera exitosa.

En el algoritmo anterior existe un certificado. Para este ejemplo, es necesario comprender algo de teoría criptográfica. En Habré hay gran artículo sobre este tema.

En este ejemplo, utilizaremos algoritmos de cifrado asimétrico. Para implementar algoritmos asimétricos, debe tener un par de claves y un certificado.

Un par de claves consta de dos partes: una clave privada y una clave pública. La clave privada, como su nombre indica, debe ser secreta. Lo usamos para descifrar información. La clave pública se puede distribuir a cualquiera. Esta clave se utiliza para cifrar datos. Por tanto, cualquier usuario puede cifrar datos utilizando la clave pública, pero sólo el propietario de la clave privada puede descifrar esta información.

Un certificado es un documento electrónico que contiene información sobre el usuario propietario del certificado, así como una clave pública. Con un certificado, el usuario puede firmar cualquier dato y enviarlo al servidor, que puede verificar la firma y descifrar los datos.

Para firmar correctamente un mensaje con un certificado, debe crearlo correctamente. Para hacer esto, primero se crea un par de claves en Rutoken y luego se debe vincular un certificado a la clave pública de este par de claves. El certificado debe tener exactamente la clave pública que se encuentra en Rutoken, esto es importante. Si simplemente creamos un par de claves y un certificado inmediatamente en el lado del cliente de la aplicación, ¿cómo puede el servidor descifrar este mensaje cifrado? Después de todo, no sabe nada sobre el par de claves ni sobre el certificado.

Si profundizas en este tema, podrás encontrar información interesante en Internet. Hay ciertas autoridades de certificación en las que obviamente confiamos. Estas autoridades de certificación pueden emitir certificados a los usuarios; instalan estos certificados en su servidor. Después de esto, cuando el cliente accede a este servidor, ve este mismo certificado y ve que fue emitido por una autoridad de certificación, lo que significa que se puede confiar en este servidor. También hay mucha información en Internet sobre cómo configurar todo correctamente. Por ejemplo, puedes empezar con esto..

Si volvemos a nuestro problema, la solución parece obvia. Necesita crear de alguna manera su propio centro de certificación. Pero antes de eso, es necesario averiguar sobre qué base el centro de certificación debería emitir un certificado al usuario, porque él no sabe nada al respecto. (Por ejemplo, su nombre, apellido, etc.) Existe algo llamado solicitud de certificado. Puede encontrar más información sobre este estándar, por ejemplo, en Wikipedia. ru.wikipedia.org/wiki/PKCS
Usaremos la versión 1.7 - PKCS#10.

Describamos el algoritmo para generar un certificado en Rutoken (fuente original: la documentación):

  1. Creamos un par de claves en el cliente y lo guardamos en Rutoken. (el guardado se produce automáticamente)
  2. Creamos una solicitud de certificado en el cliente.
  3. Desde el cliente enviamos esta solicitud al servidor.
  4. Cuando recibimos una solicitud de certificado en el servidor, emitimos un certificado de nuestra autoridad de certificación.
  5. Enviamos este certificado al cliente.
  6. Guardamos el certificado Rutoken en el cliente.
  7. El certificado debe estar vinculado al par de claves que se creó en el primer paso.

Ahora queda claro cómo el servidor podrá descifrar la firma del cliente, ya que él mismo le emitió el certificado.

En la siguiente parte, veremos más de cerca cómo configurar su autoridad de certificación basada en la biblioteca de criptografía de código abierto openSSL completa.

Fuente: habr.com

Añadir un comentario