Chiedi a Nginx di rifiutare nomi di server sconosciuti su HTTPS


7

Ho un'istanza di Nginx che utilizza SNI per servire più domini HTTPS da un singolo IP.

L'unico problema con l'installazione è che Nginx risponde con il primo dominio (che agisce come predefinito) ogni volta che viene richiesto un URL per l'IP nudo del server o un dominio elencato in quell'IP per il quale non esiste un blocco server HTTPS corrispondente. In questo caso, preferirei di gran lunga semplicemente restituire un 403 proibito standard: per fare ciò creerei un blocco server predefinito ma non riesco a vedere un modo per aggirare gli avvisi di mancata corrispondenza del certificato client.

(Come c | C) un I Nginx configura per rifiutare le richieste a tali domini sconosciuti / non definiti senza la necessità di specificare un particolare certificato SSL che sconvolgerà i browser? (cioè ho bisogno di Nginx per rifiutare la richiesta con un 403 prima di sconvolgere il client con un certificato "cattivo" - dal punto di vista del client questo dovrebbe essere identico al caso in cui nessun blocco del server HTTPS è definito affatto.)

Risposte:


7

Questa domanda è abbastanza simile a quella a cui ho risposto ieri: nginx e SNI: è possibile risolvere automaticamente il certificato SSL per nome di dominio

Non è possibile rifiutare la connessione prima che l'utente visualizzi un messaggio di certificato non valido nel suo browser. Quando Nginx potrebbe restituire una risposta HTTP 403, l'handshake SSL è terminato e per completare l'handshake il browser deve accettare il certificato fornito. È possibile rifiutare la connessione solo dopo che l'utente ha accettato il certificato impostando un server predefinito:

server {
    listen 433 default_server ssl;
    ssl_certificate       common.crt;
    ssl_certificate_key   common.key;
    return 403;
}

Tuttavia, i browser più recenti supportano l'indicazione del nome del server e se si dispone di un certificato impostato per ciascun vhost, è abbastanza improbabile che un normale utente veda quel messaggio.

Potrebbe essere possibile rifiutare le connessioni senza un nome host valido indicato da SSL con iptables ma questo è probabilmente abbastanza complicato e non sarebbe affatto conforme a nessuno standard.

Informazioni aggiornate: è possibile return 444interrompere la connessione tcp immediatamente prima che venga visualizzato un errore del certificato.


Utilizzando SNI, si potrebbe teoricamente interrompere la connessione quando non esiste un certificato per il nome di dominio specificato, il che sarebbe comunque meglio che visualizzare un errore di certificazione. Sai come si fa?
Yogu,

Sì, ho scoperto che è possibile return 444interrompere la connessione tcp prima che venga visualizzato un errore cert.
xblax,

@xblax Potresti dirci anche come restituire 444 prima che venga mostrato un certificato? Idealmente, non sprecherei risorse in una stretta di mano per una richiesta a un nome_server che non conosco. SNI dovrebbe rivelare il nome richiesto prima ancora di decifrare la richiesta.
Tempesta statica,

0

Se i tuoi domini sono sottodomini dello stesso master (* .example.com) puoi utilizzare un certificato con caratteri jolly. In caso contrario, non credo che tu possa fornire alcun certificato di cui il browser sarà soddisfatto.


Ciao chris. Apprezzo il punto jolly ma non è proprio quello che sto chiedendo. Sì, al browser non piacerà nessun certificato MA esiste un modo per rifiutare la connessione in base al nome del server richiesto? (Sospetto di no, ma questo sembra il posto giusto per chiedere ... :)
Carlton Gibson,

Presupposto non testato -> Dovrai fornire un certificato valido o il browser considererà la connessione non sicura. Pertanto, il browser non agirà su alcun reindirizzamento che gli viene inviato fino a quando l'utente non consente una sostituzione. L'unico modo in cui riesco a pensare di eseguire automaticamente l'override è fornire un certificato valido. :-(
Chris Nava,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.