Comment puis-je faire que Apache demande un certificat SSL client sans avoir besoin de le vérifier contre une autorité de certification connue?

J'utilise apache2 (2.2.3) pour desservir un site où j'aimerais que les clients s'authentifient avec les certificats. Puisque je dois seulement vérifier qu'un utilisateur présentant un certificat particulier est le même utilisateur qui a présenté ce certificat dans le passé, l'autorité de certification signant le certificat n'est pas pertinente. Il semble cependant que l'utilisation de SSLVerifyClient require nécessite SSLCACertificateFile ... (ou SSLCACertificatePath ... ), puis apache acceptera uniquement les certificats signés par une autorité de certification dans ce fichier / chemin d'accès. Existe-t-il un moyen d'obtenir que Apache accepte un certificat de client, quelle que soit l'autorité de certification de sortie / chant? (C.-à-d. Vérifier que le client possède la clé privée correspondante à la clé publique présentée, mais pas la peine de vérifier la CA d'émission / signature)

2 Solutions collect form web for “Comment puis-je faire que Apache demande un certificat SSL client sans avoir besoin de le vérifier contre une autorité de certification connue?”

Comme vous l'avez trouvé, vous pouvez désactiver la vérification des certificats au niveau de saisie SSL / TLS dans Apache Httpd en utilisant SSLVerifyCLient optional_no_ca .

Le deuxième problème que vous allez faire face à ce que vous essayez de faire est de faire en sorte que le client envoie le certificat. Étant donné que votre certificat n'est pas destiné à être dans une PKI, ils pourraient être auto-signés et avoir différents émetteurs.

Lorsque vous demandez un certificat client, le serveur envoie un message TLS CertificateRequest au client pendant le handhsake. Ce message contient la liste certificate_authorities :

Une liste des noms distinctifs des autorités de certification acceptables. Ces noms distincts peuvent spécifier un nom distinctif souhaité pour une autorité de certification racine ou pour une autorité de certification subordonnée; Ainsi, ce message peut être utilisé pour décrire les racines connues et un espace d'autorisation souhaité. Si la liste certificate_authorities est vide, le client PEUT envoyer un certificat du type ClientCertificate approprié, à moins qu'il y ait un arrangement externe contraire.

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

(Notez que la partie sur la liste vide est uniquement dans la spécification de TLS 1.1. SSL 3.0 et TLS 1.0 sont silencieux sur ceci, et en pratique, cela fonctionnera également).

Vous obtenez deux options pour cela.

  • Si les certificats de clients que vous prévoyez seront auto-signés, ils auront tous des émetteurs différents. Parce que vous ne saurez pas à quoi vous attendre, le serveur devra envoyer une liste vide. Pour ce faire, utilisez la directive SSLCADNRequestFile et SSLCADNRequestFile -le dans un fichier contenant uniquement 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-ce que vous acceptez un DN d'émetteur commun à tous les certificats de clients que vous attendez, qu'ils aient ou non été délivrés par ce certificat de CA (ou que cette AC existe ou non). Ce faisant, vous allumiez considérablement le modèle PKI (plus).

    Si vous acceptez un DN émetteur comme CN=Dummy CA (par exemple). Toute personne peut construire un certificat auto-signé en utilisant CN=Dummy CA comme DN de sujet (et DN d'émetteur), éventuellement avec différentes clés. Bien que la directive SSLCADNRequestFile s'attend à être configurée avec des certificats pour créer la liste, elle ne sert à rien de vérifier le certificat client, ce n'est qu'une configuration compliquée (mais naturelle dans le contexte des autres directives) pour configurer la liste des autorisations de certificate_authorities . Si vous, en tant que service, met un cert auto-signé avec ces noms dans SSLCADNRequestFile , cela fera que le message SSLCADNRequestFile CertificateRequest utilise CN=Dummy CA dans la liste certificate_authorities (ce ne sont que des noms, pas certs à ce stade). Le client pourra ensuite retirer son propre certificat avec l'émetteur DN CN=Dummy CA , que sa signature soit ou non vérifiée par ce certificat (même clé) ou non, car aucune vérification de signature n'est impliquée dans ces étapes de toute façon.

Cela étant dit, n'oubliez pas qu'avec SSLVerifyCLient optional_no_ca , aucune vérification de certificat réel n'est faite (je suppose que vous pouvez vérifier la variable SSL_CLIENT_VERIFY si votre vérification manuelle n'est qu'une solution de recharge à une PKI que vous avez configurée de toute façon). Tout ce que vous savez à ce stade, c'est que le client a la clé privée pour le certificat de clé publique qu'il a présenté (garanti par le message TLS CertificateVerify ): vous devrez effectuer une forme de vérification si vous voulez qu'il y ait authentification de une sorte. (Vous ne pouvez pas faire confiance au contenu du certificat, c'est l'un des liens 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 (p. Ex. PHP / CGI / … même Java si vous passez le certificat au serveur Java proxié). Une façon simple serait d'avoir une liste pré-connue de clés publiques, ou vous pouvez regarder les idées dans FOAF + SSL / WebID .

L'utilisation de SSLVerifyCLient optional_no_ca (au lieu de require ) provoque que apache ne vérifie pas l'autorité de certification émetteur (et donc ne nécessite pas un fichier ou un chemin de certification CA). Cela permet au client / utilisateur de ne pas soumettre de certificat, de sorte qu'il est nécessaire de vérifier qu'un certificat a été utilisé séparément.

(Apparemment, je n'ai tout simplement pas bien lu la documentation mod_ssl .)

  • Comment spécifier subjectAltName dans le cli openssl?
  • Désactiver la suite de chiffrement ou modifier la priorité dans apache en fonction de l'adresse IP
  • Configuration d'Apache avec hôtes virtuels et SSL sur un réseau local
  • Un certificate SSL peut-il être sur une seule ligne dans un file (pas de ligne)?
  • Puis-je passer_proxy sur https?
  • Comment puis-je utiliser HTTPS avec ce site particulier?
  • Comment puis-je faire correspondre un file de certificate à un file key?
  • "Certificat émis non encore valide." Avec wget?
  • Quel type de cercles ssl ai-je besoin pour plusieurs sous-domaines de plusieurs domaines hébergés sur un proxy inverse
  • Site https de proxy nxginx?
  • Puis-je exécuter deux sites sécurisés différents en utilisant le port 443 sur le même serveur?
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de rĂ©seau.