Come usare ssl_verify_client = ON su un server virtuale e ssl_verify_client = OFF su un altro?


9

Voglio forzare la verifica del client SSL per i miei host virtuali. Ma ottieni l'errore "Nessun certificato SSL richiesto inviato", cercando di ottenere qualcosa da esso.

Ecco le mie configurazioni di test:

# defaults                                                                                                                                                                    
ssl_certificate /etc/certs/server.cer;                                                                                                                                 
ssl_certificate_key /etc/certs/privkey-server.pem;                                                                                                                     
ssl_client_certificate /etc/certs/allcas.pem;                                                                                                                                 

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server1.example.com;                                                                                                                                          
    root /tmp/root/server1;                                                                                                                                                   

    ssl_verify_client off;                                                                                                                                                    
}                                                                                                                                                                             

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server2.example.com;                                                                                                                                          
    root /tmp/root/server2;                                                                                                                                                   

    ssl_verify_client on;                                                                                                                                                     
} 

Il primo server risponde con 200 codice http, ma il secondo restituisce "400 richiesta non valida, non è stato inviato alcun certificato SSL richiesto, nginx / 1.0.4".

Probabilmente, è impossibile usare ssl_verify_client sullo stesso IP? Devo associare questi server a IP diversi, risolverà il mio problema?

Risposte:


4

Ho riscontrato un problema simile, ma cercando di distinguere i ssl_verify_clientsblocchi di posizione all'interno di un blocco server, piuttosto che tra i blocchi server. Probabilmente potresti risolvere il tuo problema spostando le cose di configurazione ssl predefinite nei due server (duplicandole, sicuramente, o inserendole tutte in un blocco server, accettando i sottodomini multipli e usando le posizioni).

Per la soluzione basata sulla posizione, si presenta come i seguenti lavori. Uso

ssl_verify_client optional;

nel blocco server e utilizzare le istruzioni if ​​nelle varie posizioni, ad esempio:

if ($ssl_client_verify != SUCCESS) { return 403; }

Avevo bisogno di fare questo per dare accesso come amministratore a una webapp, ma consentire comunque ai webhook di github senza dare a github un client ssl cert.


2

È necessario aggiornare almeno a nginx> = 1.0.9 se si desidera avere più host virtuali basati sul nome (utilizzando SNI) sullo stesso indirizzo IP e porta, ma con ssl_verify_clientimpostazioni diverse per questi host.

Nelle versioni nginx precedenti l' ssl_verify_clientimpostazione per l'host virtuale predefinito veniva utilizzata per tutti gli altri host virtuali basati sul nome sulla stessa combinazione di porta IP +. Alcune altre opzioni SSL ( ssl_verify_depth, ssl_prefer_server_ciphers) sono state gestite allo stesso modo. L'uso di un IP o di una porta separati potrebbe essere una soluzione alternativa se non è assolutamente possibile eseguire l'aggiornamento.

Nota dal log delle modifiche nginx per 1.0.9:

*) Bugfix: the "ssl_verify_client", "ssl_verify_depth", and
   "ssl_prefer_server_ciphers" directives might work incorrectly if SNI
   was used.

Cambiamenti rilevanti nell'origine nginx: r4034 nel trunk, r4246 nel ramo 1.0.


0

Hai caricato il certificato client (in formato PKCS12) firmato dalla CA "/etc/certs/allcas.pem" nel tuo browser? In Firefox, puoi controllare i certificati dei tuoi clienti andando in Preferenze -> Avanzate -> Crittografia -> Visualizza certificati -> I tuoi certificati.

Il valore del parametro "ssl_verify_client" se "off" per impostazione predefinita. È inoltre possibile utilizzare il valore "facoltativo" se il certificato client SSL non è obbligatorio.


Sono usato curl --cert ... con gli stessi risultati.
Alexander Artemenko,

C'è qualcosa di interessante nel registro degli errori di nginx? (probabilmente /var/log/nginx/error.log)
user1025596

0

Non sono un esperto di nginx, ma ho riscontrato problemi simili con apache utilizzando SSL e host virtuali. Il problema è l'ordine in cui il server gestisce la negoziazione SSL rispetto alla scelta dell'host virtuale. Il primo passo è stabilire la connessione crittografata, e solo dopo ciò il server vede quale nome host stai chiedendo. E fino a quando non lo saprà, utilizzerà l'impostazione predefinita, che in questo caso è il primo host, che richiede un certificato client per stabilire la connessione SSL.

Quindi, risposta breve: in questo caso, faresti meglio ad avere porte separate o indirizzi IP separati.


-1

Ho riscontrato lo stesso problema e ho trovato una soluzione.

Prova ad aggiungere default_serverflag per il secondo server

listen 443 ssl default_server;
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.