¡Hola! Quiero compartir mi experiencia sobre este tema.
Rutoken es una solución de hardware y software en el área de autenticación, protección de la información y firma electrónica. En esencia, es una memoria USB que puede almacenar datos de autenticación que el usuario utiliza para acceder al sistema.
En este ejemplo se utiliza Rutoken ECP 2.0.
Para trabajar con este Rutoken es necesario.
Para Windows, la instalación de solo el controlador asegura que se instale todo lo necesario para que el sistema operativo reconozca tu Rutoken y puedas trabajar con él.
Se pueden interactuar con Rutoken de varias maneras. Se puede acceder desde la parte del servidor de la aplicación, o directamente desde la parte del cliente. En este ejemplo, se considerará la interacción con el Rutoken desde la parte del cliente de la aplicación.
La parte del cliente de la aplicación interactúa con el Rutoken a través del plugin de Rutoken. Es un programa que se instala por separado en cada navegador. Para Windows, solo es necesario descargar e instalar el plugin, .
Todo, ahora podemos interactuar con el Rutoken desde la parte del cliente de la aplicación.
En este ejemplo, se presenta la idea de implementar un algoritmo de autorización de usuario en el sistema utilizando el esquema de challenge-response.
La esencia de la idea es la siguiente:
- El cliente envía una solicitud de autorización al servidor.
- El servidor, en respuesta a la solicitud del cliente, envía una cadena aleatoria.
- El cliente complementa esta cadena con 32 bits aleatorios.
- El cliente firma la cadena recibida con su certificado.
- El cliente envía al servidor el mensaje codificado recibido.
- El servidor verifica la firma, obteniendo el mensaje original no codificado.
- El servidor separa los últimos 32 bits del mensaje no codificado recibido.
- El servidor compara el resultado obtenido con el mensaje que fue enviado en la solicitud de autorización.
- Si los mensajes son iguales, la autorización se considera exitosa.
En el algoritmo anterior hay un concepto como certificado. En el marco de este ejemplo, es necesario entender cierta teoría criptográfica. En Habr hay .
En este ejemplo, utilizaremos algoritmos de cifrado asimétricos. Para implementar algoritmos asimétricos, es necesario tener un par de claves y un certificado.
El par de claves consta de dos partes: la clave privada y la clave pública. La clave privada, como su nombre indica, debe ser secreta. La utilizamos para descifrar información. La clave pública se puede compartir con cualquiera. Esta clave se utiliza para cifrar datos. De esta manera, cualquier usuario puede cifrar datos utilizando la clave pública, pero solo 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 a quien pertenece el certificado, así como la clave pública. Al poseer un certificado, el usuario puede firmar cualquier dato y enviarlo al servidor, que puede verificar esta firma y descifrar los datos.
Para poder firmar correctamente un mensaje con un certificado, es necesario crearlo adecuadamente. Para ello, en Rutoken primero se crea un par de claves y luego el certificado debe vincularse 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 el par de claves y el certificado de inmediato en la parte del cliente de la aplicación, ¿cómo podrá el servidor descifrar este mensaje cifrado? Después de todo, no sabe nada acerca del par de claves ni del certificado.
Si profundizamos en este tema, podemos encontrar información interesante en internet. Existen ciertas autoridades certificadoras a las que confiamos de antemano. Estas autoridades pueden emitir certificados a los usuarios, y ellos instalan estos certificados en su servidor. Después de eso, cuando el cliente accede a este servidor, ve exactamente este certificado y observa que fue emitido por una autoridad certificadora, lo que significa que se puede confiar en este servidor. Hay mucha información en internet sobre cómo configurarlo correctamente. .
Volviendo a nuestra tarea, la solución parece obvia. Hay que crear algún tipo de centro de certificación. Pero antes de eso, hay que averiguar en qué fundamento debe el centro de certificación emitir un certificado al usuario, ya que no sabe nada sobre él (por ejemplo, su nombre, apellidos, etc.). Existe un concepto llamado solicitud de certificado. Se puede consultar más sobre este estándar, por ejemplo, en Wikipedia.
Vamos a utilizar la versión 1.7 — PKCS#10.
Describiremos el algoritmo para la generación de certificados en RUTOKEN (fuente original — ):
- En el cliente, creamos un par de claves y lo guardamos en el RUTOKEN. (el almacenamiento ocurre automáticamente)
- En el cliente, creamos una solicitud de certificado.
- Enviamos esta solicitud al servidor desde el cliente.
- Al recibir la solicitud de certificado en el servidor, emitimos el certificado desde nuestro centro de certificación.
- Enviamos este certificado al cliente.
- En el cliente, guardamos el certificado en el RUTOKEN.
- El certificado debe vincularse al par de claves que se creó en el primer paso.
Ahora se comprende cómo el servidor podrá descifrar la firma del cliente, ya que él mismo le emitió el certificado.
En la siguiente parte, examinaremos detalladamente cómo configurar nuestro propio centro de certificación basado en la completa biblioteca de criptografía de código abierto openSSL.
Fuente: habr.com
