Il sito HTTPS esegue chiamate ajax all'applicazione desktop http nativa

1

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?

posta albciff 25.11.2016 - 10:09
fonte

1 risposta

2

Si ottiene un certificato standard da una CA per un dominio come local.myapp.com e si associa questo host con 127.0.0.1 nel proprio DNS.

Questo abiliterà le chiamate https dalla tua pagina web all'app installata.

Si noti che potrebbero esserci problemi di sicurezza con questo. Infatti, Chromium intende bloccare queste chiamate a localhost (o aggiungere un'opzione per l'attivazione - > link ). Ma più siti stanno facendo questo:

  • Spotify (web player - app desktop): * .spotilocal.com
  • Github (file aperto in Github per Mac): ghconduit.com
  • Dropbox: www.dropboxlocalhost.com

Spiegazione di come Spotify lo fa: link

With the requirement to use HTTPS, a valid SSL certificate is needed to avoid browsers complaining. Spotify has worked around this problem by registering a domain (*.spotilocal.com) that merely points to 127.0.0.1. But rather than connecting to the top domain, they use a wildcard domain and connect to a random subdomain each time (for example abcrjdknsa.spotilocal.com). The reason for this is to avoid the browser’s max connection limit per domain, enabling more tabs in the browser to concurrently use their API at the cost of an extra DNS lookup.

    
risposta data 25.11.2016 - 17:26
fonte

Leggi altre domande sui tag