È possibile che SSL verifichi il nome host del certificato rispetto all'intestazione HTTP "host" anziché URL?

0

Questa è una piccola domanda di follow-up per verifica SSL del nome host del server https

Sto provando a richiedere una pagina tramite HTTPS direttamente da un indirizzo IP anziché da un nome host. Per quanto riguarda le risposte alla domanda precedente, capisco perché il certificato sia basato su hostname piuttosto che su IP. Tuttavia, desidero comunque richiedere la pagina direttamente dall'IP anziché da un nome host, ignorando sostanzialmente la ricerca DNS.

Per quanto ne so, l'unico modo per farlo è di evitare la convalida del certificato. Ovviamente non è il metodo più sicuro. C'è un modo invece di avere SSL controllare il certificato rispetto al nome host (noto al client) mentre si richiede ancora un IP direttamente?

    
posta Jad S 28.10.2016 - 17:32
fonte

2 risposte

3

Effettuare una connessione HTTPS ad un sito è fondamentalmente fatto in questo modo:

  1. ottieni l'indirizzo IP per il nome host di destinazione utilizzando DNS
  2. connettersi con TCP a questo indirizzo IP
  3. fai l'handshake SSL su questa connessione TCP, che include
    1. opzionalmente include il nome host di destinazione con l'estensione SNI all'inizio dell'handshake (ClientHello). Questo è necessario se più server con diversi certificati condividono lo stesso indirizzo IP e la stessa porta.
    2. verifica il certificato ricevuto dal server nell'handshake per vedere se è attendibile e anche se è valido per il nome host di destinazione
  4. una volta terminato l'handshake SSL invia la richiesta HTTP all'interno di questa connessione SSL, che include tra l'altro l'intestazione Host

Ciò che si desidera in realtà è saltare la ricerca DNS (passaggio 1) perché si conosce già l'indirizzo IP della destinazione. Hai ancora bisogno di tutti gli altri passaggi, in particolare 3.1 (SNI) e 3.2 (convalida dell'hostname nel certificato).

Questo è possibile ma il modo in cui questo viene fatto dipende dal linguaggio di programmazione e dalle librerie. La maggior parte delle lingue semplifica per te solo il caso più comune (ovvero la connessione per nome host) e casi non comuni come i tuoi sono più complessi da implementare. Ad esempio in Perl puoi semplicemente utilizzare il seguente codice per collegarti a un sito tramite indirizzo IP, ma includere l'estensione SNI appropriata per il nome host di destinazione e anche controllare il certificato con il nome host:

use IO::Socket::SSL 1.971;
my $socket = IO::Socket::SSL->new(
    PeerAddr => '1.2.3.4:443',
    SSL_hostname => 'www.example.com'
);

Come è fatto nella lingua che hai scelto è off-topic qui e on-topic su stackoverflow.com.

    
risposta data 28.10.2016 - 20:09
fonte
0

I certificati vengono emessi per nomi di dominio completi e non per indirizzi IP. Non è possibile modificare la logica per convalidare semplicemente l'intestazione Host :. Tuttavia puoi sempre ignorare l'errore che è 'Common Name doesn't match FQDN'

    
risposta data 28.10.2016 - 20:23
fonte

Leggi altre domande sui tag