web-dev-qa-db-fra.com

Test de l'authentification client SSL / TLS avec OpenSSL

Je développe une application client/serveur avec TLS. Mon idée est d'utiliser un certificat sur le client pour qu'il soit authentifié par le serveur. Également un autre certificat sur le serveur afin que le client puisse également authentifier qu'il se connecte au bon serveur.

Je veux d'abord tester et utiliser openssl s_server et openssl s_client pour valider la proposition.

Jusqu'à présent, j'ai créé une clé privée CA sur le serveur, j'ai créé un certificat racine. Avec le certificat racine, j'ai signé deux CSR, donc j'obtiens un certificat pour le serveur et un certificat pour le client.

J'ai également installé le certificat client + certificat racine sur le client et le certificat serveur + certificat racine sur le serveur.

Je veux maintenant essayer d'établir une connexion entre openssl s_server et openssl s_client et vérifier qu'ils sont tous deux authentifiés mutuellement, mais je ne peux pas me résumer avec la documentation sur la façon de le faire. Une aide ou un guide à ce sujet?

Une fois que j'ai installé cela, la prochaine étape consiste à tester le propre client développé contre ce serveur, et notre propre serveur développé contre le s_client. Pouvons-nous l'utiliser pour des tests?

Merci

14
fazineroso

Il semble que vous essayez de configurer une racine de confiance avec (1) s_client et s_server pour tester; et (2) par programmation dans votre code à l'aide d'OpenSSL.


S'assurer openssl s_client (ou openssl s_server) utilise votre racine, utilisez les options suivantes:

  • -CAfile option pour spécifier la racine
  • -cert option pour le certificat à utiliser
  • -key option pour la clé privée du certificat

Voir les documents sur s_client (1) et s_server (1) pour plus de détails.


Pour faire la même chose par programme sur le client, vous utiliseriez:

  • SSL_CTX_load_verify_locations pour charger la racine de confiance
  • SSL_CTX_use_certificate pour spécifier le certificat client
  • SSL_CTX_use_PrivateKey pour charger la clé privée du certificat client

Pour faire la même chose par programme sur le serveur, vous utiliseriez:

  • SSL_CTX_load_verify_locations pour charger la racine de confiance
  • SSL_CTX_use_certificate_chain_file pour spécifier le certificat du serveur
  • SSL_CTX_use_PrivateKey pour charger la clé privée du certificat de serveur
  • SSL_CTX_set_client_CA_list pour dire au client d'envoyer son certificat client

Si vous ne souhaitez pas utiliser les paramètres pour chaque connexion (c'est-à-dire le contexte commun), définissez-le pour chaque connexion SSL avec, par exemple, SSL_use_certificate et SSL_use_PrivateKey.

Beaucoup se passe avec SSL_CTX_set_client_CA_list. Il (1) charge les autorités de certification que le serveur utilise pour vérifier un client, (2) il oblige le serveur à envoyer une liste des autorités de certification qu'il accepte lors de la vérification d'un client, et (3) il déclenche le message ClientCertificate chez le client si le client possède un certificat qui satisfait la liste des autorités de certification acceptées du serveur.

Consultez également la documentation sur SSL_CTX_load_verify_locations (3) , SSL_CTX_use_certificate (3) , SSL_CTX_set_client_CA_list et vos amis.


Le format de certificat et de clé le plus simple à utiliser est PEM. PEM est celui qui utilise, par exemple, ----- BEGIN CERTIFICATE -----. Pour le certificat de serveur, assurez-vous que le fichier est une concaténation du certificat du serveur et de tous les intermédiaires nécessaires au client pour créer la chaîne.

Le fait que le serveur envoie tous les certificats requis est une pratique standard pour un problème connu sous le nom de problème "quel répertoire". C'est un problème bien connu dans l'ICP, et c'est essentiellement le problème que les clients ne savent pas où aller chercher les certificats intermédiaires manquants.


En général, vous connaissez maintenant les fonctions que vous devez utiliser. Téléchargez un petit serveur comme nginx , et voyez comment un serveur de production les utilise dans la pratique. Vous pouvez même utiliser un serveur SQL comme Postgres car il configure un serveur SSL/TLS. Recherchez simplement les fichiers source pour SSL_CTX_load_verify_locations ou SSL_load_verify_locations, et vous trouverez le bon endroit.

Bien que je ne le recommande pas, vous pouvez même consulter s_client.c et s_server.c. Ils sont situés dans <openssl dir>/apps. Mais le code peut parfois être difficile à lire.

27
jww