Question Comment utiliser ssl_verify_client = ON sur un serveur virtuel et ssl_verify_client = OFF sur un autre?


Je veux forcer la vérification du client SSL pour l'un de mes hôtes virtuels. Mais obtenir l'erreur "Aucun certificat SSL requis n'a été envoyé", en essayant d'obtenir quelque chose.

Voici mes configurations de 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;                                                                                                                                                     
} 

Le premier serveur répond avec un code de 200 http, mais le second renvoie "400 requêtes incorrectes, aucun certificat SSL requis n'a été envoyé, nginx / 1.0.4".

Probablement, il est impossible d'utiliser ssl_verify_client sur la même adresse IP? Si je lie ces serveurs à différentes adresses IP, cela résoudra-t-il mon problème?


6
2017-11-02 12:00


origine




Réponses:


Vous devez mettre à niveau au moins nginx> = 1.0.9 si vous souhaitez avoir plusieurs hôtes virtuels basés sur un nom (utilisant SNI) sur la même adresse IP et le même port, mais avec des paramètres différents. ssl_verify_client paramètres pour ces hôtes.

Dans les anciennes versions de Nginx, le ssl_verify_client Le paramétrage de l'hôte virtuel par défaut a été utilisé pour tous les autres hôtes virtuels nommés utilisant la même combinaison IP + port. Quelques autres options SSL (ssl_verify_depth, ssl_prefer_server_ciphers) ont également été traités de la même manière. L'utilisation d'une adresse IP ou d'un port distinct peut constituer une solution de contournement si vous ne pouvez absolument pas effectuer la mise à niveau.

Note du nginx changelog pour 1.0.9:

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

Changements pertinents dans la source nginx: r4034 dans le coffre, r4246 dans la branche 1.0.


1
2017-12-18 20:38





J'ai rencontré un problème similaire, mais cherchant à distinguer le ssl_verify_clients entre des blocs d’emplacement dans un bloc de serveur, plutôt qu’entre des blocs de serveur. Vous pourriez probablement résoudre votre problème en déplaçant les éléments de configuration par défaut de ssl sur les deux serveurs (en les dupliquant, bien sûr, ou en les plaçant tous dans un bloc de serveur, en acceptant les multiples sous-domaines et en utilisant des emplacements).

Pour la solution basée sur l'emplacement, ressemble à l'ouvrage suivant. Utilisation

ssl_verify_client optional;

dans le bloc serveur, et utilisez les instructions if dans les différents emplacements, par exemple:

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

J'avais besoin de faire cela pour donner à l'administrateur un accès à une webapp, tout en autorisant les webhooks de github sans donner à github un cert client ssl.


1
2017-10-23 20:25





Avez-vous chargé le certificat client (au format PKCS12) signé par l'autorité de certification "/etc/certs/allcas.pem" dans votre navigateur? Dans Firefox, vous pouvez vérifier vos certificats clients en allant dans Préférences -> Avancées -> Cryptage -> Afficher les certificats -> Vos certificats.

La valeur du paramètre "ssl_verify_client" si "off" par défaut. Vous pouvez également utiliser la valeur "facultatif" si le certificat du client SSL n'est pas obligatoire.


0
2017-11-02 12:50



Je suis habitué curl --cert ... avec les mêmes résultats. - Alexander Artemenko
Y a-t-il quelque chose d'intéressant dans le journal des erreurs de nginx? (probablement /var/log/nginx/error.log) - user1025596


Je ne suis pas un expert de Nginx, mais j'ai rencontré des problèmes similaires avec Apache utilisant SSL et les hôtes virtuels. Le problème est l’ordre dans lequel le serveur gère la négociation SSL par rapport au choix de l’hôte virtuel. La première étape consiste à établir la connexion cryptée, et ce n’est qu’après cela que le serveur voit le nom d’hôte que vous demandez. Et jusqu'à ce qu'il le sache, il utilisera le paramètre par défaut, qui est dans ce cas le premier hôte, qui requiert un certificat client pour établir la connexion SSL.

Donc, réponse courte - dans ce cas, vous feriez mieux d’avoir des ports ou des adresses IP séparés.


0
2017-11-16 13:09





J'ai rencontré le même problème et trouvé une solution.

S'il vous plaît essayez d'ajouter default_server drapeau pour le second serveur

listen 443 ssl default_server;

-1
2017-09-05 07:14