Authentification SSL : besoin d'avis sur usages possibles

Salut,

Contexte :

Je suis en train de bosser sur une bibliothèque réseau basée sur Qt, dont le but est de fournir un protocole IPC (communication inter-processus) / RPC (appel de procédure distante) relativement simple à utiliser tout en étant le plus complet possible, asynchrone (exploitant les signaux / slots de Qt), et dont les communications sont chiffrables grâce à SSL si nécessaire (par exemple un logiciel client / serveur pour une entreprise dont le serveur va se retrouver ouvert sur internet, et qui a besoin d’un minimum de confidentialité de ses données).

Là où c’est le plus compliqué (pour moi en tous cas), c’est concernant l’authentification SSL : les possibilités sont tellement nombreuses que je m’y perds, d’autant que c’est la première fois que j’attaque ce problème donné. Et le fait que différentes possibilités se traitent à différents moments (avant la connexion ou pendant la négociation SSL suivant les usages) n’arrange pas vraiment les choses.

Je ne souhaite pas exposer les classes Qt de gestion SSL directement aux utilisateurs de ma bibliothèque, car ma couche IPC / RPC est assez complexe (multi-threading pour ne citer que ça) et a besoin d’un contrôle assez fin sur les classes réseau, ce qui est incompatible avec les formes d’authentification qui se gèrent durant la négociation SSL.

Je me suis donc résolu à écrire également une surcouche de gestion de l’authentification SSL, totalement découplée, permettant de gérer tout ça sans interférer avec mon bazar, et qui prenne en charge les usages les plus courants quitte à compléter après quand de nouveaux besoins se feront sentir.

[size=75]Pour ceux qui n’auraient pas tout compris c’est pas grave, ce n’était que pour expliquer le contexte de ma question. De toutes façons ce n’est pas un problème de programmation, mais juste de compréhension du protocole SSL et de son écosystème.[/size]

Question :

Mon problème est que, étant débutant en ce qui concerne le SSL, je n’ai qu’une idée très vague des différentes possibilités d’authentification.
Pour le moment j’ai recensé quelques cas, mais je ne suis pas certain que ça soit exhaustif, ou que toutes ces options soient réellement nécessaires.

Authentification du serveur :
[ul][li] Certificat serveur auto-signé : le client accepte n’importe quel certificat auto-signé, ou une liste bien précise de certificats connus répondant à ce même critère.[/li]
[li] Certificat serveur délivré par une Autorité de Certification (CA) publique (VeriSign et compagnie) : le client accepte n’importe quel certificat authentifié par n’importe quelle CA publique, ou une liste bien précise de certificats connus répondant à ce même critère.[/li]
[li] Certificat serveur délivré par une CA privée (par exemple interne à une entreprise) : le client accepte n’importe quel certificat authentifié par une des CA privées connues, ou une liste bien précise de certificats connus répondant à ce même critère.[/li][/ul]

Authentification du client :
[ul][li] Le client n’est pas authentifié (anonymes du point de vue SSL).[/li]
[li] Certificat client délivré par une CA publique : le serveur accepte n’importe quel certificat authentifié par n’importe quelle CA publique, ou une liste bien précise de certificats connus répondant à ce même critère.[/li]
[li] Certificat client délivré par une CA privée : le serveur accepte n’importe quel certificat authentifié par une des CA privées connues, ou une liste bien précise de certificats connus répondant à ce même critère.[/li][/ul]

Ai-je oublié quelque chose ? Quels cas sont absolument nécessaires ou absolument inutiles ? Quels cas sont rares et peuvent donc être gérés plus tard ?
J’aimerais avoir l’avis de personnes plus compétentes que moi dans ce domaine. :006

C’est à peu près ça, sauf qu’au lieu de distinguer public et privé on va plutôt distinguer reconnu / non reconnu.

Je vais prendre le cas du Web, mais je pense qu’on retrouvera la même chose ailleurs.

Le navigateur est fourni avec une liste de certificats des CA qu’il accepte (plus ou moins pertinente…[*]).
Tu peux importer le certificat d’une CA particulière. Par exemple, une université créé sa propre CA, ses membres ont simplement à ajouter son certificat pour aller sur tous les sites de l’université.
Tu peux aussi accepter seulement un certificat particulier (c’est l’option par défaut qui t’es proposé quand tu tombes sur un certificat inconnu).

Côté serveur, tu as la possibilité de le configurer pour :

  • ne pas authentifier le client (accepter tout le monde ou laisser l’authentification client au niveau application)
  • accepter les certificats signés par une CA particulière (ainsi tu peux créer ta CA et fournir les certificats a tes usagers).
  • accepter une liste de certificats prédéfinie ???

Donc au final, ce que tu devras ajouter à la fois à ton client et à ton serveur, c’est la possibilité de reconnaitre les certificats à partir d’une liste de CA prédéfinies, en laissant la possibilité de la modifier et de rajouter des certificats particuliers.
Note que debian fournit déjà une liste de CA courantes (paquet ca-certificates, qu’on retrouve aujourd’hui dans la plupart des distributions courantes).

Note que tu peux avoir une CA dont le certificat est signé par une autre CA (qui peut aussi avoir son certificat signé par une autre CA, etc.). Le serveur peut alors fournir la liste des certificats intermédiaires pour que le site soit accepté par un navigateur qui ne reconnaitrait que la CA « la plus haute »).

[*] Je ne vais pas m’étendre sur la (non-)fiabilité du SSL, ce n’est pas le sujet…

Merci pour ces précisions. J’étais pas si loin que ça, ça me rassure. :smiley:
Plus qu’à trouver comment gérer tout ça avec Qt de manière rationnelle…