Devo memorizzare i certificati e le chiavi private dei miei utenti o no?

1

Situazione

Sto facendo uno stage in un'azienda e attualmente sto lavorando a un'applicazione web con le seguenti caratteristiche:

  • Questa è un'applicazione privata, gli utenti possono essere aggiunti solo da un amministratore dell'applicazione
  • Gli utenti possono aggiungere file PDF online
  • Quei file sono memorizzati nel server delle applicazioni

La mia missione di tirocinante è la seguente:

  • Devo implementare una funzionalità che consente ai clienti di firmare i file PDF utilizzando questo meccanismo.
    Deve essere semplice da utilizzare: un pulsante "Firma" accanto al file e il server lo firma automaticamente utilizzando il certificato utente. L'idea di base è che ogni cliente riceverà un certificato quando viene creato il suo account (l'autorità di certificazione sarà ritenuta attendibile dall'applicazione). A un certo punto dovrò ottenere la chiave privata dell'utente in plaintexte per firmare il file sul server (sto pensando di usare phpseclib libreria per leggere i certificati).

Domanda

  • Devo memorizzare i certificati degli utenti e / o le chiavi private sul server? * Non esiste un modo migliore per archiviare le chiavi private degli utenti, ad esempio un'applicazione Web affidabile con API REST o un modo semplice per accedervi?

  • Modifica: la mia situazione si è evoluta e ora la mia domanda è più simile alla seguente:

    • È sicuro memorizzare file .pfx o p12 sul server? So che contengono chiavi private, ma il file è davvero sicuro (diciamo che c'è una password client per ogni file).

Nota: sono ancora uno studente e non un esperto in sicurezza, per favore dimmi se hai bisogno di ulteriori informazioni per rispondere.

    
posta Shashimee 06.06.2017 - 15:52
fonte

2 risposte

2

Bene, dal punto di vista della sicurezza, i clienti dovrebbero firmare file PDF sui loro dispositivi. Il valore della firma dopo il caricamento del PDF è molto basso, poiché non vi è alcuna garanzia che il PDF non sia stato manomesso durante la trasmissione. Nel tuo scenario, non puoi essere certo che i PDF inviati e firmati siano gli stessi, perché l'integrità del PDF non è garantita durante la trasmissione.

In altre parole, la procedura dovrebbe essere la seguente: client acquires/generates PDF document -> sign -> upload to server -> register . In questo scenario puoi essere certo di avere il PDF esatto creato dal client (se la firma è valida).

Il fatto che il server detenga i certificati client e le loro chiavi private peggiora le cose. Puoi impersonare un client legittimo, creare firme che il client legittimo non ha mai fatto. Se l'utente malintenzionato ha hackerato il server, le chiavi di tutti gli utenti vengono automaticamente compromesse. Le chiavi private devono essere memorizzate sui dispositivi client, altrimenti non hanno alcun controllo sulla chiave, quindi nessuna responsabilità per le firme. Il risultato: valore zero della firma e progetto non riuscito.

    
risposta data 06.06.2017 - 17:05
fonte
1

Poiché gli utenti vengono aggiunti da un amministratore, l'archiviazione dei certificati utente sul server è un uso comune. Se gli utenti possono essere aggiunti dinamicamente, è comunque necessario archiviare il certificato passato al momento della connessione per riferimento futuro.

Memorizzare le chiavi nel server è non comune. La chiave è più o meno una password e le migliori pratiche consigliano di archiviare solo l'hash (qui la chiave pubblica contenuta nel certificato) sul server. Quindi le migliori regole di pratica raccomandano di non memorizzare le chiavi private sul server.

Ma qui sembra che la tua missione sia firmare il file server side. Non hai altra scelta che archiviare il lato server delle chiavi private. Il lato negativo è che un amministratore del server può firmare un file per conto di qualsiasi utente ...

AFAIK, questo è un requisito non comune. Un'operazione di firma - se si prevede di non ripudiare - dovrebbe verificarsi lato client per garantire che la chiave privata sia sempre sotto il controllo esclusivo del suo proprietario. Ma ciò richiede anche una collaborazione tra il server che invierà il file non firmato e riceverà di nuovo quello firmato e un processo che esegue il lato client (ad esempio un'applet java lato client).

    
risposta data 06.06.2017 - 17:15
fonte