2 votes

Vérifier que le certificat SSL/X.509 est signé par un autre certificat

Question

Comment puis-je vérifier qu'un certificat X.509 est signé par un autre certificat en utilisant PyOpenSSL ou Twisted ? Je veux qu'un client vérifie que le certificat de serveur reçu est celui qui a signé son certificat de client.

J'ai parcouru la documentation de PyOpenSSL et je n'ai rien trouvé sur la façon de vérifier un certificat séparément de l'établissement de la connexion SSL.

J'ai trouvé une référence à OpenSSL.crypto:X509.verify() en twisted.internet._sslverify:PublicKey.verifyCertificate() mais la méthode twisted est commentée (dans Twisted 13.0) et la méthode X509 n'existe pas (dans PyOpenSSL 0.13).

pyOpenSSL n'a pas de support pour la vérification d'un certificat. décrit un bogue pour ne pas être en mesure de vérifier manuellement une chaîne de certificats, mais je ne suis pas tout à fait sûr si c'est ce que j'essaie de faire.

Cas d'utilisation

Certificats :

  • Génération d'un certificat CA auto-signé avec openssl.

  • Certificat de serveur généré et signé par le certificat CA.

  • Certificat client généré et signé par le certificat du serveur.

Mise en place :

  • Le serveur utilise l'outil Twisted CertificateOptions avec son certificat de serveur. Les certitudes de l'AC et du serveur permettent d'établir une chaîne dans laquelle le certificat du serveur vérifie le certificat du client reçu, et le certificat de l'AC vérifie le certificat du serveur (toutes les fonctionnalités intégrées).

  • Le client utilise également CertificateOptions pour le certificat du client. Le CA certs ne contient que le CA cert.

Tout cela fonctionne bien (les deux parties se vérifient mutuellement) mais je veux effectuer une étape supplémentaire :

  • Dans le client set_verify() vérifie que le certificat du client est signé par le certificat du serveur.

0voto

Patrick Mevzek Points 3713

Vous devriez être en mesure de le faire avec quelque chose comme écrit ici : http://www.yothenberg.com/validate-x509-certificate-in-python/ qui est en gros :

  1. charger vos certificats dans PyOpenSSL avec load_certificate()
  2. créer un X509Store() objet
  3. utiliser add_cert() pour ajouter votre certificat intermédiaire dans le magasin
  4. créer un X509StoreContext() en l'initialisant avec votre objet de magasin et votre certificat final.
  5. appelez verify_certificate() sur votre objet de contexte de magasin

En pratique, je n'ai pas pu faire cette partie, et je pense que c'est pour les raisons expliquées ici : https://mail.python.org/pipermail/cryptography-dev/2016-August/000676.html

En bref, même en 2016, il ne semble toujours pas y avoir une attente correcte pour vérifier les certificats dans PyOpenSSL, ce qui est très triste. Notez que le consensus semble être que si vous opérez à l'intérieur d'une connexion TLS, les choses sont mieux vérifiées par la routine de connexion au lieu d'être hors ligne à travers. check_certificate()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X