web-dev-qa-db-fra.com

Comment puis-je faire une demande Apache Demander un certificat SSL client sans avoir à le vérifier contre une CA connue?

J'utilise Apache2 (2.2.3) pour servir un site où j'aimerais avoir des clients s'authentifier avec des certificats. Comme je n'ai besoin que de vérifier qu'un utilisateur présentant un certificat particulier est le même utilisateur qui a présenté ce certificat dans le passé, la CA Signing Le certificat est hors de propos. Il semble que l'utilisation de SSLVerifyClient require a besoin SSLCACertificateFile ... (ou SSLCACertificatePath ...), puis Apache acceptera uniquement les certificats signés par une CA dans ce fichier/chemin. Existe-t-il un moyen d'obtenir Apache d'accepter un certificat client, indépendamment de la CA d'émission/chant? (Oui. Vérifiez que le client a la clé privée correspondante à la clé publique présentée, mais pas de la vérification de la vérification de la délivrance/signature de la CA)

9
Isaac

Comme vous l'avez trouvé, vous pouvez désactiver la vérification du certificat au niveau de la poignée de main SSL/TLS dans Apache httpd à l'aide de SSLVerifyCLient optional_no_ca.

Le deuxième problème que vous allez faire face à ce que vous essayez de faire est d'obtenir le client d'envoyer le certificat. Étant donné que votre certificat n'est pas destiné à être dans un PKI, ils pourraient être auto-signés et disposer de divers émetteurs.

Lors de la demande d'un certificat client, le serveur envoie un CertificateRequest tls message au client pendant la main de poche. Ce message contient le certificate_authorities liste:

Une liste des noms distingués des autorités de certification acceptables. Ces noms distingués peuvent spécifier un nom distinctif souhaité pour une CA racine ou pour une CA subordonnée; Ainsi, ce message peut être utilisé pour décrire les racines connues et un espace d'autorisation souhaité. Si la liste de certificat_authorités est vide, le client peut envoyer n'importe quel certificat de la clientèle approprié, à moins de disposition externe au contraire.

Les navigateurs utilisent ceci pour choisir le certificat client à envoyer (le cas échéant).

(Notez que la pièce à propos de la liste vide est uniquement dans la spécification de TLS 1.1. SSL 3.0 et TLS 1.0 sont silencieux à ce sujet et dans la pratique, cela fonctionnera également.)

Vous obtenez deux options pour cela.

  • Si les certificats clients que vous attendez devraient être auto-signés, ils auront tous différents émetteurs. Parce que vous ne saurez pas à quoi vous attendre, le serveur devra envoyer une liste vide. Pour ce faire, utilisez la directive SSLCADNRequestFile directive et le pointez-le à un fichier contenant une ligne vide (si je me souviens bien, cela ne fonctionne pas avec un fichier complètement vide).

  • La deuxième option (moins propre). Est de convenir d'un émetteur DN commun à tous les certificats clients que vous attendez, qu'ils aient été délivrés ou non par ce certificat de certification (ou si cela existe ou non). Ce faisant, vous enfreigniez considérablement le modèle PKI (plus).

    Si vous êtes d'accord sur un émetteur DN comme CN=Dummy CA (par exemple). Tout le monde peut construire un certificat auto-signé en utilisant CN=Dummy CA comme sujet DN (et émetteur DN), éventuellement avec différentes clés. Bien que la directive SSLCADNRequestFile espère être configurée avec des certificats pour créer la liste, celles-ci ne sont pas utilisées pour vérifier le certificat client, c'est juste une compliqueuse (mais naturelle dans le contexte des autres directives) de Configuration de la certificate_authorities liste. Si vous, en tant que service, met un certificat auto-signé avec ces noms dans SSLCADNRequestFile, cela rendra le message CertificateRequest TLS Message Utilisez CN=Dummy CA dans le certificate_authorities Liste (ce ne sont que des noms, pas des certs à ce stade). Le client sera alors capable de prendre son propre certificat avec l'émetteur DN CN=Dummy CA, que sa signature puisse être vérifiée ou non par ce certificat (mêmes clés) ou non, car aucune vérification de la signature n'est impliquée dans ce cas de toute façon.

Cela étant dit, rappelez-vous que avec SSLVerifyCLient optional_no_ca, aucune vérification de certificat réelle n'est faite (je suppose que vous pourriez vérifier le SSL_CLIENT_VERIFY Variable Si votre vérification manuelle n'est qu'une solution de secours à un PKI, vous avez de toute façon configuré). Tout ce que vous saurez à ce stade, c'est que le client a la clé privée du certificat de clé publique qu'il a présenté (garanti par le message TLS CertificateVerify): Vous devrez effectuer une certaine forme de vérification si vous le souhaitez. là pour y avoir une authentification de quelque sorte. (Vous ne pouvez pas faire confiance à aucun des contenu du certificat, c'est-à-dire une liaison entre sa clé publique et les noms/attributs qu'il contient.)

Cela ne fonctionnera pas bien pour les fichiers, mais vous pouvez le faire pour une application (pHP/CGI/... même Java si vous transmettez le certificat au fichier proxiqué Java Server). Un moyen de base serait d'avoir une liste pré-connue de clés publiques, ou vous pouvez regarder les idées dans FOAF + SSL/webid .

10
Bruno

À l'aide de SSLVerifyCLient optional_no_ca (au lieu de require) provoque Apache de ne pas vérifier l'autorité de certification émettrice (et donc pas besoin d'un fichier de certificat de certification ou d'un chemin). Il permet au client/utilisateur de ne pas soumettre de certificat, alors vérifier qu'un certificat a été utilisé pour le tout doit être effectué séparément.

(Apparemment, je n'ai rien échoué à lire de manière approfondie le mod_ssl Documentation.)

2
Isaac