¿Está bien enviar la clave privada del usuario, incluso si está protegida con un canal SSL?

0

Estoy desarrollando un servidor web que realiza firmas digitales de documentos (xml, pdf y office) y luego valida esas firmas.

Mi idea es: un usuario coloca su tarjeta inteligente y, a través de un PIN, obtiene su clave privada. Luego, la clave privada debe enviarse al servidor, para que el servidor pueda firmar el documento con esa clave.

Incluso si la clave privada se transmite a través de un canal SSL (HTTPS), ¿es una buena idea enviar la clave privada al usuario? ¿Cuál es tu opinión? Intento evitar realizar las firmas en el lado del cliente, para que todos los dispositivos puedan acceder al servicio de firmas.

Saludos, William.

    
pregunta user3411342 12.03.2014 - 17:10
fuente

3 respuestas

3

(Solo para resumir mi respuesta a esta pregunta duplicada en SO y sus comentarios ...)

Es ciertamente una mala práctica, y también puede ser un problema legal importante.

Debido a que tanto el usuario como su servicio técnicamente han tenido acceso a la clave privada, ya no puede garantizar quién fue el firmante real ante un tercero.

  

¿Conoces alguna biblioteca javascript que firme documentos xml, pdf y office? De esta manera, la clave privada solo se usaría en el lado del cliente.

No haga criptografía de JavaScript . No podrá demostrar al usuario lo que hace su código (aún podría enviar la clave). Que yo sepa, algunos de los proyectos de WebCrypto intentaban solucionar algunos de estos problemas (por ejemplo, al permitir que un código JS use la clave privada almacenada en el navegador sin dejarlo salir), pero aún no está listo, y no resuelve todos los problemas (por ejemplo, demostrando a los usuarios lo que están firmando con esa clave privada).

Y, por supuesto, el show-stopper técnico ...

La mayoría de los mecanismos de tarjetas inteligentes no le permiten acceder a la propia clave privada (a menudo por diseño), por lo que de alguna manera tendría que interactuar con la API de firma para la tarjeta. Esa API no le dará realmente la clave privada, solo le permitirá usarla para firmar algo, el procesamiento se realiza en la propia tarjeta. Por lo tanto, cualquier plan para enviar la clave privada a algún lugar o tener algún código (que no use esta API) no funcionará.

Si bien el navegador puede utilizar el certificado en tarjetas inteligentes para la autenticación del certificado del cliente, porque los navegadores se implementan para admitir esto como parte de su propia interfaz de usuario (nada que ver con ninguna página web que pueda proporcionar), no creo hay algo obvio al tener un script en tu página web para acceder a todo esto. (Esto también dejaría el problema de confiar en lo que realmente firma su código JS).

    
respondido por el Bruno 12.03.2014 - 21:19
fuente
0

Poner la clave privada en el servidor rompe la filosofía de la infraestructura de clave pública, incluso si la transfieres de forma segura.

Con la clave privada ahora fuera del control de los usuarios, será posible que un tercero (el servidor) se haga pasar por el usuario. Esto es claramente una infracción de no repudio : el usuario podría denegar un contrato por el hecho de que él no lo aceptó, como lo hizo el administrador del servidor.

"Todos los dispositivos" no deberían poder firmar un documento como otra persona (supongo que en este caso de uso). Solo la persona cuya clave privada es debe poder firmar con ella.

¿Qué caso de uso tiene que requiera esta propuesta de distribución de clave inusual?

    
respondido por el scuzzy-delta 12.03.2014 - 20:38
fuente
0

La idea de pki es que su clave privada es el sine qua non de su identidad. No lo envías a ningún lado.

En lugar de enviarlo a algún lugar, colóquelo en un lugar (un dispositivo centralizado) y solicite su uso de forma remota. Consulte mi respuesta a la pregunta de stackexchange relacionada.

    
respondido por el Larry K 13.03.2014 - 08:52
fuente

Lea otras preguntas en las etiquetas