¿Debo almacenar los certificados y las claves privadas de mis usuarios o no?

1

Situación

Estoy haciendo una pasantía en una empresa y actualmente estoy trabajando en una aplicación web que tiene las siguientes características:

  • Esta es una aplicación privada, los usuarios solo pueden ser agregados por un administrador de la aplicación
  • Los usuarios pueden agregar archivos PDF en línea
  • Esos archivos se almacenan en el servidor de aplicaciones

Mi misión como pasante es la siguiente:

  • Tengo que implementar una función que permita a los clientes firmar los archivos PDF utilizando esto mecanismo.
    Debe ser simple para usar: un botón "Firmar" al lado del archivo y el servidor lo firma automáticamente utilizando el certificado de usuario. La idea básica es que a cada cliente se le otorgará un certificado cuando se cree su cuenta (la Autoridad de confianza sería de confianza para la aplicación). En algún momento tendré que obtener la clave privada del usuario en plaintexte para firmar el archivo en el servidor (estoy pensando en usar phpseclib biblioteca para leer certificados).

Pregunta

  • ¿Debo almacenar los certificados de usuario y / o las claves privadas en el servidor? * ¿No hay una mejor manera de almacenar las claves privadas de los usuarios, como una aplicación web confiable que tenga API REST o alguna forma fácil de acceder a ella?

  • Editar: Mi situación ha evolucionado y ahora mi pregunta es como la siguiente:

    • ¿Es seguro almacenar archivos .pfx o p12 en el servidor? Sé que contienen claves privadas, pero el archivo es realmente seguro (digamos que hay una contraseña de cliente para cada archivo).

Nota: Todavía soy un estudiante y no soy un experto en seguridad, por favor, dime si necesitas más información para responder.

    
pregunta Shashimee 06.06.2017 - 15:52
fuente

2 respuestas

2

Bueno, desde la perspectiva de la seguridad, los clientes deben firmar archivos PDF en sus dispositivos. El valor de la firma después de cargar el PDF es muy bajo, porque no hay garantía de que el PDF no haya sido manipulado durante la transmisión. En su situación, no puede estar seguro de que los PDF enviados y firmados sean los mismos, ya que la integridad del PDF no se garantiza durante la transmisión.

En otras palabras, el procedimiento debería ser el siguiente: client acquires/generates PDF document -> sign -> upload to server -> register . En este escenario, puede estar seguro de que tiene el PDF exacto creado por el cliente (si la firma es válida).

El hecho de que el servidor tenga certificados de cliente y sus claves privadas empeore las cosas. Usted puede hacerse pasar por un cliente legítimo, crear firmas que el cliente legítimo nunca hizo. Si el atacante piratea su servidor, las claves de todos los usuarios se ven comprometidas automáticamente. Las claves privadas deben almacenarse en los dispositivos cliente, de lo contrario no tienen control sobre la clave, por lo tanto, no son responsables de las firmas. El resultado: el valor cero de la firma y el proyecto fallido.

    
respondido por el Crypt32 06.06.2017 - 17:05
fuente
1

A medida que los usuarios son agregados por un administrador, el almacenamiento de los certificados de usuario en el servidor es un uso común. Si los usuarios pueden agregarse dinámicamente, aún debe almacenar el certificado aprobado en el momento de la conexión para una referencia posterior.

El almacenamiento de las claves en el servidor es no común. La clave es más o menos una contraseña, y las mejores prácticas recomiendan almacenar solo el hash (aquí la clave pública contenida en el certificado) en el servidor. Así que las mejores reglas de práctica recomiendan no almacenar las claves privadas en el servidor.

Pero aquí su misión parece ser firmar el lado del servidor de archivos. No tiene más opción que almacenar el lado del servidor de claves privadas. El inconveniente es que un administrador del servidor puede firmar un archivo en nombre de cualquier usuario ...

AFAIK, este es un requisito poco común. Una operación de firma, si espera que no se rechace, debe ocurrir en el lado del cliente para garantizar que la clave privada siempre esté bajo el control exclusivo de su propietario. Pero eso también requiere una colaboración entre el servidor que enviaría el archivo sin firmar y recibiría el firmado, y un proceso que ejecuta el lado del cliente (por ejemplo, un applet de Java del lado del cliente).

    
respondido por el Serge Ballesta 06.06.2017 - 17:15
fuente