cURL ne se connecte pas à HTTPS alors que wget le fait (erreur NSS -12286)


8

Je reçois une erreur NSS error -12286lors du téléchargement d'un fichier à partir de HTTPS à l'aide de curl.

Je peux télécharger le même fichier sans problème en utilisant wgetainsi je peux exclure tout problème de pare-feu ou de liste noire.

Déjà essayé, sans chance, les options -ket --cipher ecdhe_ecdsa_aes_128_gcm_sha_256, c'est le chiffrement préféré du serveur selon l'outil Qualys SSL Labs Test Server ici: https://www.ssllabs.com/ssltest/analyze.html?d=intribunale.net&latest

Voici le cURLjournal:

# curl -v https://www.intribunale.net/immobili
* About to connect() to www.intribunale.net port 443 (#0)
*   Trying 104.27.150.214... connected
* Connected to www.intribunale.net (104.27.150.214) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* NSS error -12286
* Closing connection #0
* SSL connect error
curl: (35) SSL connect error

Mes versions de lib sont:

# curl -V
curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz

Pertinent: www-archive.mozilla.org/projects/security/pki/nss/ref/ssl/… où il est indiqué que l'erreur NSS -12286 signifie SSL_ERROR_NO_CYPHER_OVERLAP«Impossible de communiquer en toute sécurité avec l'homologue: pas d'algorithme (s) de chiffrement commun (s)». Les systèmes locaux et distants ne partagent aucune suite de chiffrement en commun. Cela peut être dû à une mauvaise configuration à chaque extrémité. Cela peut être dû à une configuration incorrecte du serveur pour utiliser un certificat non RSA avec l'algorithme d'échange de clés RSA.
— Celada

2
Je peux reproduire votre problème avec CentOS6.7 curl-7.19.7-46.el6 nss-3.21.0-0.3.el6_7 sur un serveur de test. Par défaut, il n'offre aucune suite ECC, et puisque votre serveur (Cloudfare) accepte uniquement certaines suites ECC (spécifiquement ECDHE), la négociation échoue. En --cipher[s]spécifiant cette suite ECDHE, il n'envoie même pas ClientHello, ferme simplement la connexion et donne l'erreur. Cela semble être quelque chose de désynchronisé en interne, peut-être après le long déni d'ECC par RedHat. RedHat wget utilise OpenSSL, et le récent RedHat OpenSSL prend en charge ECC (uniquement avec P256 P384 P521 mais cela suffit ici).
— dave_thompson_085

1
Mon premier choix serait (0) de ne pas utiliser (cette) boucle, mais si vous voulez vraiment que les options que je vois sont: (1) si vous avez du support, signalez-le comme un bug et espérez qu'il le corrige. (2) c'est open source; déboguez et corrigez-le vous-même. (3) c'est open source; reconstruire contre openssl (au lieu de NSS) qui devrait fonctionner. (4) configuré stunnel(qui utilise openssl) en tant que plain-to-SSL, indiquez curl http(notS)://localhost[:port]/whatevermais ajoutez-le -H "Host: realhost"afin que le serveur cible ne puisse pas faire la différence. ...
— dave_thompson_085

1
... (5) similaire mais plus officiel: configurez un vrai proxy HTTP en utilisant openssl ici, ou tout SSL / TLS compatible TLS1.2-ECDHE sur un autre système sous votre contrôle, peut-être même une VM sur votre machine réelle, comme HAproxy ou nginx ou même httpd, auquel vous vous connectez avec HTTP simple ou au moins non-ECDHE HTTPS mais reliez au serveur réel avec un bon ECDHE HTTPS.
— dave_thompson_085

1
NSS en amont prend définitivement en charge ECDHE depuis longtemps. RedHat depuis des années jusqu'à la fin de 2014 a supprimé (toutes les variantes de) ECC de leurs versions de packages de chiffrement (AFAIK all, définitivement OpenSSL NSS OpenJDK) pour de vagues raisons `` juridiques '', que j'ai appelé ci-dessus `` long déni ''. Je suppose que quand ils l'ont remis, ils ont fait une erreur probablement mineure en affectant ce cas curl / NSS. Je ne connais aucune autre distribution qui a fait cela, mais il y en a beaucoup et quelqu'un pourrait; dans celui que j'ai actuellement Ubuntu, 14.04LTS Trusty, curl utilise OpenSSL et prend en charge ECDHE.
— dave_thompson_085

Réponses:


8

La solution était mise à niveau vers cURL 7.42 à l'aide d'un référentiel tiers pour CentOS 6 ou à partir de sources


14
La mise à niveau du package nss (ie yum update nss) ou l'utilisation curl -1pourrait également résoudre ce problème.
— DiegoG

1
Merci! J'ai rencontré ce problème car le serveur nécessite tlsv1.2. La mise à niveau a résolu mon problème.
— hao

la mise à jour du nss consiste à résoudre ce problème
— Sơn Lâm

4

Nous avons eu le même problème avec curl 7.19.7. Nous avons mis à niveau NSS et cela a résolu le problème!


0

Sur CentOS 6 avec le dernier paquet openssl (1.0.1e) Vous devez mettre à jour nss (yum update nss) comme DiegoG l'a écrit ci-dessus. La commande update-ca-trust peut également être utile. Si vous utilisez curl via php - redémarrez votre processus / service de serveur Web (c.-à-d. Service httpd restart).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.