Bridging TLS handshake per lasciare la chiave privata nel browser

0

Situazione

Abbiamo un'app Web a singola pagina che consente all'utente di trascinare i propri certificati e la propria chiave privata. Questi vengono quindi utilizzati per l'autenticazione nel servizio web.

Mentre i browser sono in grado di eseguire un handshake TLS che include l'autenticazione del client tramite HTTPS, utilizzano solo i certificati installati nell'archivio certificati del sistema operativo (ad esempio Chrome su macOS o MS Edge su Windows) o nell'archivio certificati del browser (ad es. Firefox) .

Tuttavia, non c'è modo di fornire un certificato / chiave privata alle API di richiesta fornite dal browser come standardizzate dal W3C. Ad esempio, fetch () consente solo di specificare se le credenziali installate dovrebbero essere incluse oppure no.)

Domanda

È ragionevole implementare qualche tipo di addizione; "TLS bridging" servizio nella nostra situazione?

Funzionerebbe come segue:

  • Il servizio di bridging accetta il certificato dal client (ad esempio tramite HTTP),
  • ... avvia in modo sincrono un handshake con il vero servizio di autenticazione del client
  • ... e risponde passando la sfida di handshake TLS al client.
  • Il client è in grado di risolvere la sfida con la chiave privata rilasciata e di inviarla di nuovo con una richiesta HTTP aggiuntiva
  • Il servizio di bridging può quindi rispondere al risultato dell'handshake / richiesta (ad esempio il token di autenticazione)

UPDATE 1:

Vincoli

Per ora sono impostati i seguenti vincoli tecnici:

  • Soluzione solo JS nell'app Web (ad es. senza Flash)
  • La chiave privata del client non deve essere trasmessa a nessun server
  • L'installazione manuale del certificato su OS / browser non deve essere necessaria.

UPDATE 2:

A partire dal 20 marzo 2018 il W3C elenca lo Standard di autenticazione Web come "Candidate Recommendation" che risolverebbe il problema problema descritto nell'offerta di API standardizzate per eseguire l'autenticazione del client. I documenti MDN sono anche abbastanza istruttivi sull'utilizzo di tale API nello stato corrente.

    
posta Leo Selig 03.04.2018 - 09:56
fonte

1 risposta

3

Non c'è modo di dividere l'handshake TLS in tre parti nel modo in cui si immagina, cioè quella parte della stretta di mano che proviene dal client originale, parte dal servizio "bridging TLS" e parte dal server.

Una ragione è che il messaggio Finished dal lato client non può essere costruito in modo che il server lo accetti: il messaggio Finished richiede sia il segreto principale sia un hash su tutti i messaggi di handshake. Ma poiché il master secret è noto solo al client originale e tutti i messaggi di handshake sono noti solo al servizio di bridging TLS (poiché ha aggiunto messaggi all'handshake) né il il client originale e il servizio di bridging TLS hanno tutte le informazioni necessarie per costruire il messaggio Finished .

Tutto ciò che si può fare è creare un full man nel proxy intermedio che si traduca in una connessione TLS completa tra client e servizio di bridging e un altro tra il servizio di bridging e il server. Ovviamente il servizio di bridging dovrebbe quindi ricreare il certificato del server originale utilizzando la propria CA e il client dovrebbe avere fiducia nella CA del servizio di bridging.

    
risposta data 03.04.2018 - 10:45
fonte

Leggi altre domande sui tag