OpenSSL non rileva le CA nella cartella certs


9

Stiamo riscontrando problemi con la curlmancata connessione a un server HTTPS:

$ curl https://the-problem-site.com    (not the real URL!)   
curl: (35) error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)

1112 è SSL_R_TLSV1_UNRECOGNIZED_NAMEin ssl.h.

Se provo openssl s_client -connect the-problem-site.com:443invece, vedo

CONNECTED(00000003)   
depth=1 /C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA   
verify error:num=20:unable to get local issuer certificate   
verify return:0   

Certificate chain   
0 s:/serialNumber=xx/C=xx/ST=xx/L=xxxx/O=xx/OU=xx/CN=the-problem-site.com   
i:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA   
1 s:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA   
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA   

cioè sembra che il problema sia che non si fida /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA. Tuttavia quel cert è installato: è /etc/ssl/certs/GeoTrust_Global_CA.pem, e se invece corro

openssl s_client -connect the-problem-site.com:443 -CAfile /etc/ssl/certs/GeoTrust_Global_CA.pem

allora tutto funziona. Il certificato è anche presente come file con nome hash b0f3e76e.0ed è presente ca-certificates.crt. Tuttavia, per quanto posso vedere, né curl né openssl stanno tentando di leggere alcun certificato; se straceli avessi , non c'è nessun tentativo di leggere /usr/lib/ssl/certso /etc/ssl/certsaffatto, nemmeno con errori. Legge comunque openssl.cnf. Abbiamo corso update-ca-certificates.

Questo è Ubuntu 10.04 con openssl 0.9.8k. Possiamo riprodurre il problema su due installazioni separate (anche se è possibile che uno sia un clone dell'altro). Se provo lo stesso test su una VM CentOS con openssl 0.9.8e, allora funziona benissimo e posso vederlo mentre legge il file del certificato strace. Non esiste un accesso equivalente ai file nello stesso punto nelle righe di Ubuntu. Se copio il openssl.cnffile dalla VM CentOS alle macchine Ubuntu non fa differenza. Non c'è nulla di ovvio nell'ambiente o in un file .rc che potrebbe causare questo.

Qualche idea su cosa sto facendo di sbagliato? Dovrebbe funzionare, ad es. Openssl e curl raccolgono automaticamente le CA installate dalla riga di comando? Come viene configurato? Grazie!


Un altro punto dati: su un'installazione pulita di 13 server, curlraccoglie il file dei certificati e funziona benissimo. openssl s_clientcomunque no. Perché dovrebbe essere?


Stiamo riscontrando esattamente lo stesso problema. Sento un po 'di schifo in openssl!
milosgajdos,

@Rup Hai trovato una soluzione a questo? Aggiungi e segna una risposta in tal caso. Stiamo assistendo a questo stesso comportamento.
Mike S,

@MikeS Non mi dispiace, ma non faccio parte di quella squadra. Glielo chiederò domani.
Rup,

Risposte:


4

Esistono diverse librerie crittografiche sul tuo sistema:

  • OpenSSL (il gold standard, con una licenza in stile BSD (molto gratuito) che include una clausola alquanto problematica (che impedisce la compatibilità GPL, ma niente di "cattivo") che ne limita l'adozione nel mondo GNU)
  • GnuTLS (la sostituzione di FSF; disponibile in due versioni, con licenza LGPLv2 (ma non mantenuta) e con licenza LGPLv3 (e quindi incompatibile con i programmi solo GPLv2); storicamente non è così caratteristica come OpenSSL, un po 'più buggy, ma più severa anche, che migliora la sicurezza)
  • NSS (libreria di Netscape / Mozilla, raramente utilizzata all'esterno; lento ad adottare nuovi standard)
  • quelli minori come PolarSSL, MatrixSSL, NaCl / Salt

Tutti hanno, ovviamente, somiglianze e differenze. Il software che li utilizza (per scopi crittografici o per utilizzare SSL / TLS) a volte supporta l'utilizzo di più di una di queste librerie (ad esempio Lynx, il browser Web, è normalmente collegato a OpenSSL ma supporta anche GnuTLS (ma non altrettanto buono) in per placare il popolo GNU).

cURL è anche uno dei progetti che supportano l'utilizzo di una delle tre principali librerie di criptovalute. Ciò è dovuto principalmente al fatto che cURL è, in primo luogo, una libreria destinata ad essere utilizzata da altri programmi quando vogliono scaricare (o persino caricare) cose utilizzando connessioni http, ftp, ecc. Lo curlstrumento da riga di comando può provenire da una di queste varianti.

Ora, sono abbastanza sicuro che il problema che stai riscontrando con il sistema non appena installato è il seguente:

OpenSSL e GnuTLS supportano entrambi l'utilizzo di /etc/ssl/certs/<hash>.<number>directory CA in stile. OpenSSL versione 0.xe GnuTLS utilizzano tuttavia un algoritmo diverso per calcolare l' hash sopra menzionato rispetto a OpenSSL versione 1.x. (Entrambi possono coesistere su un sistema; se certificati diversi hanno lo stesso hash , basta usare un numero diverso per loro. Ma per qualche ragione, il ca-certificatespacchetto Debian / Ubuntu non sembra farlo.) Inoltre, alcune versioni di GnuTLS non lo hanno fatto supporta l'utilizzo della directory, ma solo l'utilizzo di un file /etc/ssl/certs/ca-certificates.crt(che di solito è anche gestito dagli ca-certificatesscript del manutentore del pacchetto, ma può deviare); sembra che tu stia utilizzando una versione precedente, quindi questa potrebbe essere la cosa che colpisci.

openssl s_clientper impostazione predefinita (ovvero senza l' opzione -CApatho -CAfile) non cerca da nessuna parte i certificati.

Il tuo curldall'installazione aggiornata molto probabilmente utilizza una libreria di crittografia diversa rispetto curlalla nuova installazione.

Prova openssl s_client -CAfile /etc/ssl/certs/ca-certificates.crt -connect the-problem-site.com:443oltre a openssl s_client -CApath /etc/ssl/certs -connect the-problem-site.com:443imitare il comportamento delle versioni precedenti di GnuTLS.

Ricontrolla se c'è un OpenSSL 1.x in qualsiasi parte del tuo sistema (Ubuntu è noto per aver rubato importanti aggiornamenti anche nelle versioni LTS) e, in caso affermativo, controlla l'hash del file:

openssl x509 -noout -hash -in /etc/ssl/certs/GeoTrust_Global_CA.pem
openssl x509 -noout -subject_hash_old -in /etc/ssl/certs/GeoTrust_Global_CA.pem
openssl x509 -noout -subject_hash -in /etc/ssl/certs/GeoTrust_Global_CA.pem

Normalmente, il secondo e il terzo comando dovrebbero fallire (OpenSSL 0.x), oppure il primo e il terzo comando dovrebbero mostrare lo stesso hash ma il secondo dovrebbe mostrare un hash diverso (OpenSSL 1.x). GnuTLS userebbe l'output del secondo comando (se è installato OpenSSL 1.x); se è installato OpenSSL 0.x è lo stesso hash. È possibile creare tali collegamenti simbolici manualmente.

Posso aggiornare questo post una volta fornito il feedback di debug.

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.