2 votes

OpenSSL/HAProxy vérifient les certificats des clients en utilisant un certificat non-CA

Je suis confronté à un problème lors de la configuration d'une instance HAProxy (v1.8.13) avec un support OpenSSL compilé pour accepter uniquement les certificats clients qui ont été signés par une certificat non-CA . En particulier, je veux utiliser un certificat intermédiaire (non auto-signé) comme ancre de confiance lors de la vérification des certificats des clients.

Voici la configuration que j'utilise :

frontend myfrontend
     bind *:${PORT} ssl crt /certs/haproxy-server-cert-bundle.pem ca-file /certs/intermediate_cert2.pem verify required

Les clients se connectent via des certificats qui remplissent la chaîne de certificats suivante :

client certificate -> intermediate cert1 -> intermediate cert2 (this should become the new trust anchor) -> root CA certificate

Lorsque cette configuration est utilisée, la connexion au HAProxy via le certificat du client entraîne l'erreur suivante : Feb 13 09:17:26 my-forwarder haproxy[108]: <ip>:<port> [13/Feb/2019:09:17:26.619] my-forwarder/1: SSL client CA chain cannot be verified

Si je spécifie le certificat de l'autorité de certification racine comme ancre de confiance ( ca-file dans la configuration de HAProxy), la poignée de main TLS peut être établie avec succès. Cependant, je ne veux accepter que les certificats qui ont été signés par la branche des certificats. certificat intermédiaire 2 -> certificat de l'autorité de certification racine et non par i.e. un autre certificat intermédiaire -> certificat de l'autorité de certification racine .

J'ai essayé de reproduire ce comportement en utilisant simplement OpenSSL verify et via une configuration OpenSSL s_server/s_client. Il semble que le même problème existe en utilisant ces outils.

Quelques preuves :

$ openssl verify -CAfile test-certificate-chain.pem test-cert.pem test-cert.pem: C = ..., O = ..., OU = ..., ST = ..., CN = intermediate-cert2 error 2 at 2 depth lookup:unable to get issuer certificate

En ajoutant le certificat de l'autorité de certification racine à -CAfile, on obtient : $ openssl verify -CAfile <(cat test-certificate-chain.pem root-ca.pem) test-cert.pem test-cert.pem: OK

Les deux seules options que j'ai pu trouver pour résoudre ce problème sont les suivantes :

  • Créez un certificat d'autorité de certification auto-signé qui signe le fichier certificat intermédiaire2 la clé publique du certificat. Le certificat d'autorité de certification auto-signé doit ensuite être installé dans le fichier de configuration HAProxy ca-file la clé de configuration.
  • Configurer le HAProxy pour ignorer l'erreur OpenSSL numéro 2 (impossible d'obtenir le certificat de l'émetteur) via la clé de configuration du HAProxy ca-file /certs/intermediate_cert2.pem verify required ca-ignore-err 2

Je ne suis pas encore satisfait en termes de niveau de sécurité lorsque j'utilise l'une ou l'autre des options ci-dessus. Je serais donc curieux de savoir s'il existe une solution plus "propre" à ce problème.

Quelqu'un d'autre a-t-il été confronté à un problème similaire ?

Merci !

1voto

lyaffe Points 448

Mise à jour : J'ai résolu le problème un peu différemment car je n'ai pas réussi à trouver un moyen de faire confiance à un certificat intermédiaire (non-CA) sans faire confiance au certificat parent (CA) via la vérification de la chaîne de certificats via OpenSSL.

L'alternative était d'utiliser la puissante fonction ACL de HAProxy. En particulier :

frontend my-frontend
    ...
    acl my_tls_ca_issuer_acl ssl_c_i_dn(cn) -m reg ^<some-regex-matching-the-client-cert's-issuer-cn>$
    tcp-request content reject unless my_tls_ca_issuer_acl

Je configure HAProxy pour qu'il n'accepte que les certificats de clients émis par une entité qui correspond à un nom commun donné (regex). Voici ce que le matcheur ssl_c_i_dn(cn) fait (voir le documentation pour plus de détails).

En mettant en œuvre cette méthode, je n'ai malheureusement pu établir une correspondance qu'avec le nom distingué (DN) de l'émetteur/parent du certificat du client (certificat intermédiaire 1), et non avec son grand-parent (certificat intermédiaire 2).

J'espère quand même que cela aidera quelqu'un

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X