Pourquoi ne puis-je pas vérifier cette chaîne de certificats?

16

J'ai trois certificats dans une chaîne:

  • root.pem
  • intermediaire.pem
  • john.pem

Lorsque je les examine à l'aide de openssl x509 -in [filename] -text -nooutleur apparence, root.pem semble être auto-signé (Issuer == Subject), et le sujet de chaque certificat est l'émetteur du suivant, comme prévu.

Et en effet je peux vérifier la chaîne jusqu'au certificat intermédiaire:

$ openssl verify -CAfile root.pem root.pem
root.pem: OK
$ openssl verify -CAfile root.pem intermediate.pem
intermediate.pem: OK

Cependant, john.pem échoue:

$ openssl verify -CAfile root.pem -CAfile intermediate.pem john.pem
john.pem: C = CL, [...redacted data...]
error 2 at 1 depth lookup:unable to get issuer certificate

À ma connaissance, cela signifie que openssl n'est pas en mesure de trouver l'émetteur de intermediaire.pem. Ce qui n'a pas de sens puisque root.pem est bien l'émetteur de intermediaire.pem.

Qu'est-ce que je rate?


Edit: j'avais initialement posté une réponse disant que root.pem et intermediaire.pem devraient être concaténés dans un fichier, puis on devrait utiliser ce fichier comme paramètre pour -CAfile. C'est faux, car cela fait implicitement confiance à intermediaire.pem, comme le souligne Johannes Pille . Lisez le lien qu'il a publié dans ma réponse supprimée: https://mail.python.org/pipermail/cryptography-dev/2016-August/000676.html

Jong Bor
la source
Veuillez supprimer votre réponse, c'est une désinformation dangereuse!
Johannes Pille
1
@JohannesPille Terminé, merci pour l'information
Jong Bor
Bravo pour l'avoir fait et réaction rapide.
Johannes Pille

Réponses:

14

Vous n'avez pas besoin de regrouper les deux certificats pour les vérifier.

Si vous disposez des trois certificats suivants:

  • root.pem - stocke un certificat auto-signé.
  • intermediaire.pem - stocke un certificat signé par root.pem
  • john.pem - stocke un certificat signé par intermediaire.pem

Et vous ne faites confiance qu'à root.pem, vous vérifierez alors john.pemavec la commande suivante:

openssl verify -CAfile root.pem -untrusted intermediate.pem john.pem

Si vous aviez de nombreux intermédiaires, vous pourriez simplement enchaîner -untrusted intermediate2.pem -untrusted intermediate3.pem ...

antiduh
la source
Ce. Est la seule bonne réponse.
Johannes Pille
Je pensais que si j'avais les certificats d'autorité de certification intermédiaire et racine dans le bundle, opensslje les récupèrerais et vérifierais les certificats. Y a-t-il une raison à cela? Par exemple, la personne qui a signé le certificat utilisateur ne l'a pas signé avec l'intermédiaire mais avec la racine, ou quelque chose?
FilBot3
La dernière phrase de cette réponse est fausse. Si vous avez de nombreux intermédiaires, vous devez les concaténer en un seul fichier intermédiaire, puis utiliser l' untrustedindicateur une fois. L'utilisation de l'indicateur non approuvé plusieurs fois ne fonctionne pas.
AjaxLeung
1
@AjaxLeung - les deux -untrustedoptions multiples (dans n'importe quel ordre) ou une seule -untrustedoption pointant vers un ensemble d'intermédiaires (concaténés dans n'importe quel ordre) fonctionnent. C'est avec OpenSSL version 1.1.1c sur Ubuntu.
garethTheRed
Ouais je me suis trompé. Je pense que je n'utilisais pas les bons fichiers au moment où j'ai écrit le commentaire.
AjaxLeung
3

ce que @antiduh a dit ne fonctionne que pour un seul cas de certificat intermédiaire pour moi. En ajouter plusieurs -untrusted intermediate.pemdans la commande ne semble pas fonctionner. Je ne sais pas si c'est lié à une version spécifique d'OpenSL.

Selon le document openssl: [ https://linux.die.net/man/1/verify]

-fichier non approuvé

Un fichier de certificats non approuvés. Le fichier doit contenir plusieurs certificats

Dans mon cas, j'ai une chaîne comme: root.pem -> intermediate1.pem -> intermediate2.pem -> john.pem

par cat intermediaire1.pem et intermediaire2.pem dans un seul fichier intermediaire-chain.pem puis exécutez openssl verify -CAfile root.pem -untrusted intermediate-chain.pem john.pemfonctionne pour moi.

Il semble également que l'extension in ca que vous devez définir, basicConstraints = CA:truesinon je rencontre toujours opensl, vérifiez l'erreur de rapport.

Yang Xu
la source