Errore certificato SSL: verifica errore: num = 20: impossibile ottenere il certificato emittente locale


11

Ho provato a ottenere una connessione SSL a un server LDAPS (Active Directory) per funzionare, ma continuo ad avere problemi. Ho provato a usare questo:

openssl s_client -connect the.server.edu:3269 

Con il seguente risultato:

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

Ho pensato, OK, beh, il server è un vecchio server di produzione di qualche anno. Forse la CA non è presente. Ho quindi estratto il certificato dall'output in un file pem e ho provato:

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

E neanche quello ha funzionato.

Cosa mi sto perdendo? Non dovrebbe SEMPRE funzionare?

ssl  openssl 

Per motivi di chiarezza, sembra che LDAPS, quando servito da Windows, non presenti il ​​certificato CA quando viene stabilita una connessione. Pertanto, è necessario ottenere il certificato CA X.509, esportare come base64 e assegnare come descritto nelle risposte di seguito. Nel mio caso, usando python-ldap lo assegni nell'ambito GLOBAL (non la tua istanza ldap.initialize ()) come: ldap.set_option(ldap.OPT_X_TLS_CACERTFILE,'./ca_issuer_cert.pem') Dopo questo, sono stato in grado di usare STARTTLS (all'interno della porta LDAP 389) come previsto.
Mbrownnyc,

Risposte:


4

Quindi questo è quello che vedo come il nome del certificato 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

Questo era il nome del certificato che avevo importato dopo aver eseguito i -showcerts nel mio secondo tentativo sopra. Ho elencato i certificati nel keystore facendo questo:

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

Vedo il certificato CA lì dentro.

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

Per essere sicuro che openssl stia usando il keystore che sto usando con il server, sto usando l'argomento -CAfile:

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

Sapendo che il keystore java per CA ha una password, ho provato a usare l'opzione -pass pass: password in questo modo:

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

ma neanche quello ha funzionato.

La cosa divertente è che il file cacerts ha una password e openssl non si lamenta di non poter leggere il file cacerts. Mi sembra strano. Quello o qualcos'altro suona un campanello?


3

Questo errore è il modo di openssl di dire "Non riesco a seguire la catena di certificati fino a una radice attendibile". Ho appena fatto lo stesso comando ai miei server AD e ottengo una catena di certificati completa, ma il certificato superiore ha quell'errore esatto. Se si dispone della chiave pub della CA che ha firmato il certificato, è possibile specificarlo con le opzioni -CAfileo-CApath


Ok, grazie per la risposta. Quindi l'ho provato. Ottenuto il certificato CA facendo la stessa cosa con l'opzione -showcerts attivata, afferrato l'altro certificato. Questo dovrebbe essere il certificato CA, giusto? Ho provato quello invece del certificato del server nel file pem e ho ottenuto lo stesso messaggio di errore. Qualche altro pensiero?

In tal caso è probabile che non riesca la convalida per un altro motivo, ad esempio la scadenza.
sysadmin1138

1

Ho provato a ottenere una connessione SSL a un server LDAPS (Active Directory) per funzionare, ma continuo ad avere problemi. Ho provato a usare questo:

Se stai usando OpenLDAP, puoi impostare:

TLS_REQCERT=never

nel tuo openldap.conffile, che indica a OpenLDAP di non tentare la verifica del certificato. C'è un'opzione simile se stai facendo l'autenticazione LDAP con Apache.

Se desideri veramente eseguire la verifica del certificato, potrebbe essere utile quanto segue:

Cosa mi sto perdendo? Non dovrebbe SEMPRE funzionare?

Io non la penso così. Mentre quanto segue può sembrare definitivo, è davvero solo il mio miglior ospite:

Quello che hai provato avrebbe funzionato solo per un certificato autofirmato. Poiché il certificato è stato effettivamente emesso dalla CA di Windows, tentando di utilizzare il certificato del server come argomento per -CAfilenon ottenere nulla.

Ottenuto il certificato CA facendo la stessa cosa con l'opzione -showcerts attivata, afferrato l'altro certificato. Questo dovrebbe essere il certificato CA, giusto?

Non necessariamente, no. Non è garantito che il server remoto presenti il ​​certificato CA nel suo output. Devi prima guardare l'emittente del certificato del server:

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

... e poi vedi se uno degli altri certificati che hai corrisponde a quell'emittente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.