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

9

Je veux forcer la vérification du client SSL pour l'un de mes hôtes virtuels. Mais obtenez l'erreur "Aucun certificat SSL requis n'a été envoyé", en essayant d'en 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 200 codes http, mais le second renvoie "400 Bad Request, 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 IP? Dois-je lier ces serveurs à différentes IP, cela résoudra-t-il mon problème?

Alexander Artemenko
la source

Réponses:

4

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

Pour la solution basée sur la localisation, ressemble aux travaux suivants. Utilisation

ssl_verify_client optional;

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

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

J'avais besoin de le faire pour donner à l'administrateur un accès à une webapp, tout en autorisant les webhooks depuis github sans donner à github un certificat SSL client.

Ethan
la source
2

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

Dans les anciennes versions de nginx, le ssl_verify_clientparamètre de l'hôte virtuel par défaut était utilisé pour tous les autres hôtes virtuels basés sur le nom sur la même combinaison de ports IP +. Certaines autres options SSL ( ssl_verify_depth, ssl_prefer_server_ciphers) ont également été gérées de la même manière. L'utilisation d'une adresse IP ou d'un port séparé peut être une solution de contournement si vous ne pouvez absolument pas mettre à niveau.

Remarque du journal des modifications nginx 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 tronc, r4246 dans la branche 1.0.

Sergey Vlasov
la source
0

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é -> 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 client SSL n'est pas obligatoire.

user1025596
la source
Je suis utilisé 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
0

Je ne suis pas un expert de Nginx, mais j'ai vu des problèmes similaires avec Apache utilisant SSL et des 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 dans ce cas est le premier hôte, qui nécessite un certificat client pour établir la connexion SSL.

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

Jenny D
la source
-1

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

Veuillez essayer d'ajouter un default_serverindicateur pour le deuxième serveur

listen 443 ssl default_server;
yfliu
la source