web-dev-qa-db-fra.com

haproxy avec authentification du certificat client signé par "commun" ca

Excusez-moi si je l'ai posté ici mal, je sais que la question est en partie sur Haproxy elle-même.

Je confie haproxy en tant que terminateur SSL/équilibreur de chargement devant une API que nous devons exposer sur Internet à un client.

Le plan était d'utiliser des SSL/https mutuels (à 2 voies) afin de vérifier que les deux parties sont qui elles sont, car il n'y a aucune autre authentification sur l'API elle-même. En plus de cela, nous utiliserons également un whitelist IP.

Maintenant, le client nous a donné un certificat que les deux parties utilisent pour les certificats de serveur et de clients, ce certificat est signé par une CA "Digicert)" commune). Si je comprends bien cela, c'est du point de vue du client, car le certificat est également comparé au nom d'hôte du serveur, c'est l'accès, mais l'inverse ne semble pas être aussi sûre (du moins pas avec haproxy)

La façon dont je comprends actuellement, je dois dire à Haprexy de faire confiance aux certificats signés par Digicert à l'aide de la directive "CA-File '", cependant, il n'ya aucun moyen de le dire qu'en plus de cela, il doit également être un client spécifique. Certificat, car je ne veux pas faire confiance à tous les certificats clients signés par Digicert.

Y a-t-il un moyen de le faire avec haproxy? Sinon, je suppose que la seule voie à suivre consisterait à créer des certificats clients auto-signés aux deux côtés et à les échanger (ou plutôt aux demandes de signature de certificat et à les signaler à l'autre des certificats).

Ou ma compréhension de l'ensemble du concept de certificat client a-t-elle été fausse?

6
Sartsj

Bâtiment sur la réponse de StackZoFZTuff, j'ai compris qu'il est en fait possible d'avoir Haproxy le faire elle-même en utilisant une ACL.

Avec les 2 lignes suivantes, je peux simplement vérifier le CN dans le client client. Et refuser des demandes qui n'ont pas de CN correspondant.

acl validcert ssl_c_s_dn(cn) -m str VALID\ CERT\ CN
http-request deny if !validcert
4
Sartsj

Vous pouvez lire le champ "Nom commun" du certificat, puis le transmettre à l'arrière-plan, comme vous le souhaitez:

hTTP-DEMANDE SET-HEADER X-SSL-Client-CN% {+ Q} [SSL_C_S_DN (CN)]

Et si vous combinez cela avec la CA de votre propre délivrance des certificats, vous pouvez alors mettre un nom d'utilisateur dans ce domaine. Puis lisez-le avec haproxy.

Décrit ici: http://blog.haproxy.com/2013/06/13/ssl-client-certificate-information-in-http-aders-and-logs/

2
StackzOfZtuff

Je ne connais pas avec Haproxy, mais je ne pense pas qu'il puisse être configuré pour faire votre logique d'authentification, ce qui signifie accepter quelques certificats de même CA, lors du processus de vérification de la certification.

Y a-t-il un moyen de le faire avec haproxy? Sinon, je suppose que la seule voie à suivre consisterait à créer des certificats clients auto-signés aux deux côtés et à les échanger (ou plutôt aux demandes de signature de certificat et à les signaler à l'autre des certificats).

Vous pouvez vous construire CA au-dessus de openssl avec pas beaucoup de travail. Vous devez probablement autoriser également les clients également, vous pouvez donc fournir des informations sur le sujet du certificat des clients et les vérifier dans la couche d'application.

0
Amabo