web-dev-qa-db-fra.com

OpenSSL ne peut pas obtenir de certificat d'émetteur local sauf si CAfile est explicitement spécifié

J'essaie de me connecter au service de notification push d'Apple à partir d'un serveur Ubuntu pour une application. J'ai réussi à générer le certificat .pem combiné requis par le fournisseur pyAPNS que j'utilise. Cependant, lorsque j'essaie de vérifier le certificat avec openssl verify, Je reçois error 20 at 0 depth lookup:unable to get local issuer certificate. Cela fonctionne si je spécifie explicitement l'autorité de certification (openssl verify apns.pem -CAfile entrust_2048_ca.pem), mais j'ai déjà explicitement installé le certificat Entrust sur le système comme indiqué ici , sous "Importation d'un certificat dans la base de données de l'autorité de certification à l'échelle du système", et pour autant que je sache - cette page , tout est comme il devrait être (le certificat est dans/usr/lib/ssl/certs et il y a un lien symbolique avec le hachage).

La même chose se produit si j'essaie de me connecter à l'APSN lui-même avec openssl s_client: il semble bien se connecter si je spécifie explicitement le CAfile, mais sinon non. PyAPNS me dit qu'il ne peut pas se connecter au serveur APNS, et je peux seulement présumer que c'est pour la même raison.

Comment puis-je faire en sorte qu'OpenSSL reconnaisse l'autorité de certification Entrust par défaut, sans le spécifier explicitement à chaque fois? Suis-je en train de manquer une étape quelque part?

12
antialiasis

OpenSSL utilise un hachage du DN émetteur du certificat pour rechercher le fichier dans le répertoire par défaut où les certificats CA sont installés.

Voir documentation OpenSSL verify :

-Répertoire CApath

Un répertoire de certificats approuvés. Les certificats doivent avoir des noms de la forme: hash.0 ou avoir des liens symboliques vers eux de cette forme (`` hachage '' est le nom du sujet du certificat haché: voir l'option -hash de l'utilitaire x509). Sous Unix, le script c_rehash créera automatiquement des liens symboliques vers un répertoire de certificats.

Ces valeurs de hachage proviendront du nom distinctif du sujet de chaque certificat CA (car l'objectif est de rechercher un certificat CA avec le sujet correspondant à l'émetteur du certificat à vérifier). Vous pouvez soit utiliser c_rehash comme indiqué, ou obtenez le hachage du DN du sujet à l'aide de openssl x509 -subject_hash -noout -in cacert.pem et renommez le fichier/lien en conséquence.

L'émetteur direct du certificat à vérifier n'est peut-être pas un certificat d'autorité de certification racine: il peut y avoir un certificat d'autorité de certification intermédiaire dans la chaîne. Vous devez également vous assurer que les certificats intermédiaires sont utilisés.

De plus, il existe deux formats de hachage distincts (il y a eu un changement depuis OpenSSL version 1.0), cela vaut la peine de faire un lien en utilisant les deux -subject_hash_old et -subject_hash, bien qu'OpenSSL lui-même ne devrait par défaut utiliser que son nouveau format.

15
Bruno