Erreur de certificat SSL: vérifiez l'erreur: num = 20: impossible d'obtenir le certificat d'émetteur local

11

J'ai essayé d'obtenir une connexion SSL à un serveur LDAPS (Active Directory) pour fonctionner, mais j'ai toujours des problèmes. J'ai essayé d'utiliser ceci:

openssl s_client -connect the.server.edu:3269 

Avec le résultat suivant:

verify error:num=20:unable to get local issuer certificate 

Je pensais, OK, et bien le serveur est un ancien serveur de production vieux de quelques années. Peut-être que l'AC n'est pas présente. J'ai ensuite extrait le certificat de la sortie dans un fichier pem et essayé:

openssl s_client -CAfile mycert.pem -connect the.server.edu:3269

Et cela n'a pas fonctionné non plus.

Qu'est-ce que je rate? Cela ne devrait-il PAS TOUJOURS fonctionner?


la source
Par souci de clarté, il semble que LDAPS, lorsqu'il est servi à partir de Windows, ne présente pas le certificat de l'autorité de certification lorsqu'une connexion est établie. Par conséquent, vous devez obtenir le certificat CA X.509, exporter en base64 et attribuer comme décrit dans les réponses ci-dessous. Dans mon cas, en utilisant python-ldap, vous l'assignez à la portée GLOBALE (et non à votre instance ldap.initialize ()) comme: ldap.set_option(ldap.OPT_X_TLS_CACERTFILE,'./ca_issuer_cert.pem') Après cela, j'ai pu utiliser STARTTLS (dans le port LDAP 389) comme prévu.
mbrownnyc

Réponses:

4

Voici donc ce que je vois comme le nom du certificat CA:

depth=1 /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at //www.verisign.com/rpa (c)10/CN=VeriSign Class 3 International Server CA - G3
verify error:num=20:unable to get local issuer certificate
verify return:0

C'était le nom du certificat que j'avais importé après avoir fait les -showcerts dans mon deuxième essai ci-dessus. J'ai répertorié les certificats dans le magasin de clés en procédant comme suit:

$JAVA_HOME/bin/keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts

Je vois le certificat CA là-dedans.

Alias name: versign2006
Creation date: Jan 21, 2011
Entry type: trustedCertEntry

Owner: CN=VeriSign Class 3 International Server CA - G3, OU=Terms of use at www.verisign.com/rpa (c)10, OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5, OU="(c) 2006 VeriSign, Inc. - For authorized use only", OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Serial number: 641be820ce020813f32d4d2d95d67e67
Valid from: Sun Feb 07 19:00:00 EST 2010 until: Fri Feb 07 18:59:59 EST 2020
Certificate fingerprints:
  MD5:  BA:B0:65:B4:3B:9C:E8:40:30:21:7D:C5:C6:CD:3F:EB
  SHA1: B1:8D:9D:19:56:69:BA:0F:78:29:51:75:66:C2:5F:42:2A:27:71:04

Pour vous assurer que openssl utilise le magasin de clés que j'utilise avec le serveur, j'utilise l'argument -CAfile:

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts

Sachant que le magasin de clés java pour les autorités de certification a un mot de passe, j'ai essayé d'utiliser l'option -pass pass: password comme ceci:

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts -pass pass:changeit

mais cela n'a pas fonctionné non plus.

Ce qui est drôle, c'est que le fichier cacerts a un mot de passe et openssl ne se plaint pas qu'il ne peut pas lire le fichier cacerts. Cela me semble louche. Est-ce que cela ou quelque chose d'autre vous dit quelque chose?

Brian
la source
3

Cette erreur est la façon dont openssl dit: "Je ne peux pas suivre la chaîne de certificats jusqu'à une racine de confiance". Je viens de faire la même commande à mes propres serveurs AD et j'obtiens une chaîne de certificats complète, mais le certificat supérieur a cette erreur exacte. Si vous avez la clé de publication de l'autorité de certification qui a signé le certificat, vous pouvez la spécifier avec les options -CAfileou-CApath

sysadmin1138
la source
Ok, merci pour la réponse. J'ai donc essayé ça. J'ai obtenu le certificat CA en faisant la même chose avec l'option -showcerts, j'ai récupéré l'autre certificat. Cela devrait être le certificat CA, non? J'ai essayé cela au lieu du certificat de serveur dans le fichier pem et j'ai obtenu le même message d'erreur. D'autres réflexions?
Dans ce cas, il est probable que la validation échoue pour une autre raison, telle que son expiration.
sysadmin1138
1

J'ai essayé d'obtenir une connexion SSL à un serveur LDAPS (Active Directory) pour fonctionner, mais j'ai toujours des problèmes. J'ai essayé d'utiliser ceci:

Si vous utilisez OpenLDAP, vous pouvez définir:

TLS_REQCERT=never

dans votre openldap.conffichier, qui indique à OpenLDAP de ne pas tenter de vérifier le certificat. Il existe une option similaire si vous effectuez une authentification LDAP avec Apache.

Si vous souhaitez vraiment effectuer une vérification de certificat, les éléments suivants peuvent vous aider:

Qu'est-ce que je rate? Cela ne devrait-il PAS TOUJOURS fonctionner?

Je ne pense pas. Bien que les éléments suivants puissent sembler définitifs, ce n'est vraiment que mon meilleur invité:

Ce que vous avez essayé ne fonctionnerait que pour un certificat auto-signé. Étant donné que le certificat a été réellement émis par l'autorité de certification Windows, vous essayez d'utiliser le certificat de serveur comme argument pour -CAfilene rien obtenir.

J'ai obtenu le certificat CA en faisant la même chose avec l'option -showcerts, j'ai récupéré l'autre certificat. Cela devrait être le certificat CA, non?

Pas nécessairement, non. Il n'y a aucune garantie que le serveur distant présente le certificat CA dans sa sortie. Vous devez d'abord regarder l'émetteur du certificat de serveur:

openssl x509 -in server.crt -noout -text | grep Issuer

... puis voyez si l'un des autres certificats que vous avez correspond à cet émetteur.

larsks
la source