Comment puis-je faire que Apache request un certificate SSL client sans avoir besoin de le vérifier contre une autorité de certificateion connue?
J'utilise apache2 (2.2.3) pour desservir un site où j'aimerais que les clients s'authentifient avec des certificates. Puisque je dois seulement vérifier qu'un user présentant un certificate particulier est le même user qui a présenté ce certificate dans le passé, l'autorité de certificateion qui a signé le certificate n'est pas pertinente. Il semble toutefois que l'utilisation de SSLVerifyClient require
nécessite SSLCACertificateFile ...
(ou SSLCACertificatePath ...
), puis apache n'acceptera que les certificates signés par une autorité de certificateion dans ce file / path d'access. Existe-t-il un moyen d'get que Apache accepte un certificate de client, quel que soit l'autorité de certificateion de sortie / chant? (c.-à-d. vérifier que le client possède la key privée correspondante à la key publique présentée, mais pas la peine de vérifier la CA d'émission / signature)
- Réécrire sur https sans certificate?
- Curl: (35) erreur de connexion SSL
- Besoins d'adresse IP du certificate Amazon ELB et SSL
- SVN + HTTPS = Impossible de lire la ligne d'état: la connection a été fermée par le server
- Est-ce que mon site est sécurisé si le cadenas SSL n'apparaît pas?
- Contre le renouvellement d'un SSL de production sur un server de développement?
- Quel type de certificate SSL ai-je besoin?
- Les règles de redirection nginx n'agissent pas comme prévu (redirect vers de mauvais sites)
- Impossible d'utiliser (certificate générique auto-signé) Certificat SSL dans le site Windows Azure (WAWS)
- Version inattendue de la lenteur du téléchargement après activation SPDY sur Nginx
- Installer un certificate SSL sur Apache Windows Server 2012 R2
- Génération d'une request de signature de certificate pour ESXi 5.5
- Comment installer un certificate SSL de rlocation sur un server Mac OS X?
2 Solutions collect form web for “Comment puis-je faire que Apache request un certificate SSL client sans avoir besoin de le vérifier contre une autorité de certificateion connue?”
Comme vous l'avez trouvé, vous pouvez désactiver la vérification du certificate 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 d'amener le client à envoyer le certificate. Étant donné que votre certificate n'est pas destiné à être dans une PKI, ils pourraient être auto-signés et avoir divers émetteurs.
Lors de la request d'un certificate client, le server envoie un message TLR CertificateRequest
au client pendant le handhsake. Ce message contient la list certificatee_authorities
:
Une list des noms distinctifs des autorités de certificateion acceptables. Ces noms distincts peuvent spécifier un nom distinctif souhaité pour une autorité de certificateion racine ou pour une autorité de certificateion subordonnée; Ainsi, ce message peut être utilisé pour décrire les racines connues et un espace d'autorisation souhaité. Si la list certificatee_authorities est vide, le client PEUT envoyer un certificate du type ClientCertificate approprié, à less qu'il y ait un arrangement externe contraire.
Les browsers utilisent ceci pour choisir le certificate client à envoyer (le cas échéant).
(Notez que la partie de la list 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 certificates 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 server devra envoyer une list vide. Pour ce faire, utilisez la directive
SSLCADNRequestFile
etSSLCADNRequestFile
-le dans un file contenant uniquement une ligne vide (si je me souviens bien, cela ne fonctionne pas avec un file complètement vide). -
La deuxième option (less propre). Est-ce que vous acceptez un DN d'émetteur commun à tous les certificates de clients que vous prévoyez, qu'ils aient ou non été délivrés par ce certificate de CA (ou que cette CA existe ou non). Ce faisant, vous allez rompre considérablement le model PKI (plus).
Si vous acceptez un DN d'émetteur comme
CN=Dummy CA
(par exemple). Toute personne peut build un certificate auto-signé en utilisantCN=Dummy CA
comme DN du sujet (et DN émetteur), éventuellement avec différentes keys. Bien que la directiveSSLCADNRequestFile
s'attend à être configurée avec des certificates pour créer la list, elle n'est pas utilisée pour vérifier le certificate client, c'est simplement une configuration compliquée (mais naturel dans le context des autres directives) de la configuration de la list des permissions decertificatee_authorities
. Si vous, en tant que service, met un certificate autonome avec ces noms dansSSLCADNRequestFile
, cela fera que le messageSSLCADNRequestFile
CertificateRequest
utiliseCN=Dummy CA
dans la listcertificatee_authorities
(ce ne sont que des noms, pas certs à ce stade). Le client pourra ensuite retirer son propre certificate avec le DN de l'émetteurCN=Dummy CA
, que sa signature soit ou non vérifiée par ce certificate (même key) ou non, car aucune vérification de signature n'est impliquée dans ces étapes de toute façon.
Ceci étant dit, n'oubliez pas qu'avec SSLVerifyCLient optional_no_ca
, aucune vérification de certificate 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 key privée pour le certificate de key 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 certificate, c'est l'un des liens entre sa key publique et les noms / attributes qu'il contient.)
Cela ne fonctionnera pas bien pour les files, mais vous pouvez le faire pour une application (p. Ex. PHP / CGI / … même Java si vous passez le certificate au server Java proxié). Une façon simple serait d'avoir une list pré-connue de keys 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 certificateion émetteur (et ne nécessite donc pas de file ou de path de certificateion CA). Il permet au client / user de ne pas soumettre de certificate, de sorte qu'il est nécessaire d'effectuer un certificate pour qu'il soit nécessaire d'effectuer un certificate séparément.
(Apparemment, je n'ai tout simplement pas bien lu la documentation mod_ssl
.)