Sto lavorando su un'app Web che comunica con un'applicazione desktop installata localmente per ottenere informazioni sul certificato dal computer dell'utente ed eseguire firme digitali.
Attualmente è possibile generare automaticamente chiavi ed eseguire firme digitali con questi tasti generati automaticamente in javascript utilizzando window.crypto
. Tuttavia non c'è modo di utilizzare javascript o html per accedere alle chiavi utente emesse da un fornitore di CA installato su OS o sul keystore di Firefox per eseguire le firme digitali, ecco perché inoltriamo l'applicazione nativa installata.
Questa applicazione nativa è un porting di una vecchia applet java perché - si spera - presto questa tecnologia non sarà supportata per tutti i principali browser (attualmente è non ancora supportato in Chrome da settembre 2015 e inoltre non è supportato in Edge), oltre al plugin java stesso sarà deprecato in Java 9 . Attualmente abbiamo un Java Web Start funzionante, ma è un requisito per avere un modo alternativo per eseguire le firme, dal momento che JNLP non è molto amichevole per farlo: richiede di scaricare ogni volta un JNLP su una macchina utente con la firma configurazione, non c'è comunicazione dal browser a JNLP ed è necessario eseguire il polling AJAX sul back-end per controllare se la firma è finita ...
L'applicazione nativa è fondamentalmente un server http locale che espone i metodi di business attraverso un'API REST, in questo modo è facile da usare dalla nostra app Web semplicemente facendo alcune chiamate AJAX e affrontando il risultato.
Funziona perfettamente quando l'app Web viene distribuita in HTTP, il problema è che la nostra app Web è protetta con HTTPS, ma la nostra applicazione nativa è un server HTTP, quindi evidentemente per ragioni di sicurezza per impostazione predefinita i principali browser bloccano le nostre chiamate AJAX dall'app Web alla nostra applicazione nativa a causa di contenuti misti.
Tutti i fornitori di CA rilasceranno un certificato server per un dominio localhost e inoltre, poiché l'applicazione nativa è installata sul client, la chiave privata sarà disponibile su ogni macchina client, quindi sicuramente un certificato emesso da una CA ufficiale non è una possibilità. Si noti inoltre che la nostra applicazione nativa deve funzionare su ambienti eterogenei: SO diverso, browser diverso, reti diverse, quindi una soluzione proxy per SSL non è un'opzione.
Una possibile soluzione che mi viene in mente è quella di generare un certificato autofirmato e configurare la nostra applicazione nativa in modo che funzioni come un server HTTPS. Tuttavia vedo una falla in questa soluzione: l'applicazione nativa automaticamente o il client deve installare manualmente questo certificato nell'archivio trust SO del cliente o nell'archivio fiduciario firefox, questo è un problema di sicurezza perché stai aggiungendo un certificato autofirmato in un negozio fidato.
La mia domanda è:
-
Installare un certificato server autofirmato per localhost direttamente nel trust store è un problema di sicurezza, ma come è davvero pericoloso / sfruttabile? Se rilasci il cert per
CN=127.0.0.1
se non ci sono proxy sulla rete o host modificati non è possibile che un server di terze parti serva il contenuto per te lì, no? Questa soluzione è così brutta come sembra? -
Esiste un modo alternativo di comunicare tra un'applicazione Web in HTTPS con un'applicazione nativa in modo semplice, intuitivo e supportato per tutti i principali browser?