Differenza openssl s_client vs stunnel

1

Sto accedendo a un servizio web protetto da SSL.

Da un lato, se accedo a questo servizio web con openssl s_client , copiando la relativa richiesta POST http da un file html-request , ottengo una risposta HTTP/1.1 200 OK .

D'altra parte, se imposto SSL-Layer con stunnel (ascolto sulla porta locale 1443 e inoltro del traffico crittografato al server) e quindi uso

cat html-request | nc localhost 1443

il server risponde con HTTP/1.1 400 Bad Request .

Supponevo che entrambi gli strumenti non pre-processassero il contenuto dal file html-request . Ma questa ipotesi sembra essere sbagliata, altrimenti otterrei la stessa risposta in entrambi i casi.

Due domande:

1) In che modo openssl s_tunnel e nc differiscono nell'elaborare i dati di input da html-request ?

2) esiste un modo per ottenere un hexdump del traffico non crittografato da openssl s_client , considerando che uso le chiavi private di Elliptic Curve (quindi wireshark non è in grado di decrittografare il traffico)? L'opzione -debug sembra scaricare il traffico crittografato.

    
posta DoRe 07.12.2016 - 17:09
fonte

1 risposta

1

Nessuno strumento modifica il traffico all'interno della connessione crittografata. Quindi il problema non è legato a ciò che sta accadendo a livello HTTP. E quindi anche se c'è un modo per ottenere i dati non cifrati che stai chiedendo, è probabile che non ti possa aiutare.

C'è tuttavia un'altra possibile spiegazione, che si riferisce a ciò che accade al livello TLS. L'estensione SNI per TLS consentirà al client di comunicare il nome host non crittografato al server prima che il server invii i dati al client. Questa estensione è necessaria per i proxy inversi basati sui nomi e per i server che ospitano più domini con certificati diversi da un singolo indirizzo IP.

Per ragioni di sicurezza, Apache (e probabilmente anche altri server HTTP) verificheranno che ogni client che invia un nome host usando SNI ripete lo stesso nome host nell'intestazione dell'Host HTTP. Se il client non ripete lo stesso hostname, Apache risponderà con un codice di errore 400.

s_client non usa SNI per impostazione predefinita, ma ha un'opzione per attivarlo. E puoi istruire s_client a inviare tutto ciò che vuoi nel campo SNI. In questo modo puoi riprodurre l'errore 400 con s_client .

Ho trovato un rapporto su stunnel che inviava un'intestazione SNI errata causando lo stesso problema che stai vedendo.

Ispezionando il traffico crittografato usando Wireshark o qualsiasi altra utilità di acquisizione di rete, puoi vedere quale nome host viene inviato usando SNI (se esiste) e in questo modo verifica se il problema che stai vedendo è dovuto a un uso scorretto di SNI come nella domanda collegata.

    
risposta data 07.12.2016 - 23:34
fonte

Leggi altre domande sui tag