web-dev-qa-db-fra.com

Difficulté à comprendre la vérification de la chaîne de certificats SSL

Mon application utilise SSL pour communiquer en toute sécurité avec un serveur et elle a du mal à vérifier la chaîne de certificats. La chaîne ressemble à ceci:

Autorité de certification Entrust.net Secure Server -> DigiCert Global CA -> * .ourdomain.com

Nous utilisons un magasin de certificats extrait de Mozilla. Il contient le certificat Entrust.net, mais pas celui de DigiCert Global CA.

Ma compréhension est qu'une autorité intermédiaire ne doit pas être approuvée tant que l'autorité racine l'est, mais la vérification échoue:

% openssl verify -CAfile mozilla-root-certs.crt ourdomain.com.crt
error 20 at 0 depth lookup:unable to get local issuer certificate

Dois-je donc faire explicitement confiance à la DigiCert Global CA pour que la vérification réussisse? Cela semble faux. Mais tu me dis!

EDIT : Je comprends maintenant que le fichier de certificat doit être disponible pour OpenSSL dès le départ. Quelque chose comme ça fonctionne:

% openssl verify -CAfile mozilla-root-certs.crt -untrusted digicert.crt ourdomain.com.crt
ourdomain.com.crt: OK

Cela me permet de fournir une copie de l'AC DigiCert sans dire explicitement "je lui fais confiance", la chaîne entière doit encore être vérifiée.

Mais les navigateurs comme Firefox ne seront pas toujours livrés avec une copie de chaque certificat dont il aura besoin. Il y aura toujours de nouvelles autorités de certification et il s'agit d'utiliser la sécurité du certificat racine pour s'assurer que toutes les autorités de certification intermédiaires sont valides. Droite? Alors, comment cela fonctionne ? Est-ce vraiment aussi idiot que ça en a l'air?

35
joshk0

Les certificats intermédiaires doivent être installés sur vos serveurs Web ainsi que les certificats pour votre propre domaine. J'avais ce même problème la semaine dernière ... Firefox semble être plus pointilleux que le reste des navigateurs à ce sujet.

17
David

Voici la bonne façon de vérifier un certificat provenant d'un serveur Web

  • Le client gère une liste de certificats CA ROOT approuvés
  • Les serveurs Web doivent renvoyer le certificat de serveur suivant - Obligatoire
  • Certificat (s) intermédiaire (s) - Obligatoire Cert ROOT CA - Non requis/Facultatif

Lorsqu'un client est connecté à un serveur, il obtient le certificat de serveur et les certificats intermédiaires du serveur. Le client crée ensuite une chaîne de confiance à partir du certificat du serveur, via le ou les certificats intermédiaires, vers l'un des certificats CA ROOT auxquels il fait confiance. Les certificats ROOT sont toujours auto-signés - c'est donc là que la chaîne s'arrête.

Voici une commande simple pour tester un certificat de serveur Web en utilisant openssl

openssl s_client -CAfile <root ca file> -quiet -showcerts -connect IP:PORT

Dans le cas de l'hébergement virtuel, où plusieurs certificats sont servis sur la même IP: PORT, l'indication du nom de serveur (SNI) peut être activée à l'aide de -servername <FQDN>. Sinon, le certificat par défaut sera envoyé.

7
telveer