2009-09-21 13 views
33

Mon application utilise le protocole SSL pour communiquer en toute sécurité avec un serveur et rencontre des difficultés pour vérifier la chaîne de certificats. La chaîne ressemble à ceci:Problème de compréhension de la vérification de la chaîne de certificats SSL

Entrust.net Autorité de certification serveur sécurisé -> DigiCert mondial CA -> * .ourdomain.com

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

Je crois comprendre qu'une autorité intermédiaire ne doit pas faire confiance aussi longtemps que l'autorité racine 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 

Alors dois-je faire confiance explicitement le DigiCert mondial CA ordonner que la vérification soit acceptée? Cela semble faux. Mais tu me le dis!

EDIT: Je comprends maintenant que le fichier de certificat doit être disponible pour OpenSSL à l'avance. Quelque chose comme cela 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'DigiCert CA sans dire explicitement « Je fais confiance », a toute la chaîne doit encore être vérifiée.

Mais sûrement les navigateurs comme Firefox ne seront pas toujours livrés avec une copie de chaque certificat dont ils auront besoin. Il y aura toujours de nouvelles autorités de certification et le but est 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 fait ce travail? Est-ce vraiment aussi bête que ça en a l'air?

+0

Sous OpenBSD, '-CAfile' peut être défini sur'/etc/ssl/cert.pem'. –

Répondre

16

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

+4

Aha ... D'accord. Merci pour la perspicacité David. Pour ceux qui viennent ici de Google, le mot-clé pour la configuration d'apache est SSLCertificateChainFile. Voir ceci (de DigiCert lui-même!) http://www.digicert.com/ssl-certificate-installation-apache.htm –

+0

Le plus génial. Merci, Josh, cela m'a beaucoup aidé. – 0xCAFEBABE

6

est ici bonne façon de vérifier un certficate provenant d'un serveur web

  • client conserve une liste des certificats CA ROOT confiance
  • serveurs Web doit retourner le certificat de serveur suivant - requis
  • certificat intermédiaire (s) - Requis ROOT CA Cert - Non requis/Facultatif

Lorsqu'un client est connecté à un serveur, il obtient le certificat de serveur et intermedia le (s) certificat (s) du serveur. Le client crée ensuite une chaîne de confiance à partir du certificat du serveur, via 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 là que s'arrête la chaîne.

Voici une simple commande 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 d'hébergement virtuel, où plusieurs certificats sont servis sur la même IP: PORT, indication du nom du serveur (SNI) peut être activé en utilisant -servername <FQDN>. Sinon, le certificat par défaut sera envoyé.