O cURL não se conecta ao HTTPS enquanto o wget (erro NSS -12286)

8

Estou recebendo um erro NSS error -12286ao baixar um arquivo do HTTPS usando curl.

É possível fazer o download do mesmo arquivo sem problemas, wgetpara excluir quaisquer problemas de firewall ou lista negra.

Já tentei, sem sorte, opções -ke --cipher ecdhe_ecdsa_aes_128_gcm_sha_256, esse é o código preferido do servidor de acordo com a ferramenta Qualys SSL Labs Test Server aqui: https://www.ssllabs.com/ssltest/analyze.html?d=intribunale.net&latest

Aqui está o cURLlog:

# 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

Minhas versões da lib são:

# 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
Marco Marsala
fonte
Relevante: www-archive.mozilla.org/projects/security/pki/nss/ref/ssl/… onde diz que o erro NSS -12286 significa SSL_ERROR_NO_CYPHER_OVERLAP"Não é possível se comunicar com segurança com os pares: nenhum algoritmo (s) de criptografia comum". Os sistemas local e remoto não compartilham conjuntos de cifras em comum. Isso pode ser devido a uma configuração incorreta em cada extremidade. Pode ser que um servidor esteja configurado incorretamente para usar um certificado não-RSA com o algoritmo de troca de chaves RSA.
Celada
2
Posso reproduzir seu problema com o CentOS6.7 curl-7.19.7-46.el6 nss-3.21.0-0.3.el6_7 em um servidor de teste. Por padrão, ele não oferece suítes ECC e, como o servidor (Cloudfare) aceita apenas determinadas negociações de suítes ECC (especificamente ECDHE), falha. Ao --cipher[s]especificar esse conjunto ECDHE, ele nem envia o ClientHello, apenas fecha a conexão e dá o erro. Isso parece estar fora de sincronia internamente, talvez após a longa negação do ECH pela RedHat. O RedHat wget usa OpenSSL, e o RedHat OpenSSL recente suporta ECC (apenas com P256 P384 P521, mas é o suficiente aqui).
Dave_thompson_085
1
Minha primeira opção seria (0) não usar (este) curl, mas se você realmente deseja as opções que vejo são: (1) se você tiver suporte, relate-o como um bug e espere que eles o consertem. (2) é de código aberto; depure e corrija você mesmo. (3) é de código aberto; recrie com o openssl (em vez do NSS) que deve funcionar. (4) configure stunnel(que usa o openssl) como simples para SSL, informe curl, http(notS)://localhost[:port]/whatevermas adicione -H "Host: realhost"para que o servidor de destino não saiba a diferença. ...
dave_thompson_085
1
... (5) semelhante, mas mais oficial: configure um proxy HTTP real usando o openssl aqui ou qualquer SSL / TLS compatível com TLS1.2-ECDHE em outro sistema em seu controle, talvez até uma VM em sua máquina real, como HAproxy ou nginx ou mesmo httpd, ao qual você se conecta com HTTP simples ou pelo menos HTTPS não ECDHE, mas retransmite para o servidor real com boas HTTPS ECDHE.
Dave_thompson_085
1
O NSS upstream definitivamente suporta ECDHE por um longo tempo. O RedHat, por anos até o final de 2014, removeu (todas as variantes do) ECC de suas compilações de pacotes de criptografia (todos AFAIK, definitivamente OpenSSL NSS OpenJDK) por vagas razões 'legais', que acima eu chamei de 'negação longa'. Acho que, quando o colocaram de volta, cometeram algum erro provavelmente menor, afetando esse caso de curl / NSS. Não conheço nenhuma outra distribuição que tenha feito isso, mas há muitas e alguém pode; no Ubuntu que tenho atualmente, 14.04LTS Trusty, o curl usa o OpenSSL e suporta ECDHE.
Dave_thompson_085

Respostas:

8

A solução estava atualizando para o cURL 7.42 usando um repositório de terceiros para o CentOS 6 ou construindo a partir de fontes

Marco Marsala
fonte
14
Atualizar o pacote nss (ou seja yum update nss) ou usar curl -1também pode resolver isso.
DiegoG
1
Obrigado! Encontrei esse problema porque o servidor requer tlsv1.2. A atualização resolveu meu problema.
hao 23/11
atualizar o nss é corrigir esse problema #
Sâm Lâm
4

Tivemos o mesmo problema com o curl 7.19.7. Atualizamos o NSS e ele corrigiu o problema!

Jacob Klein
fonte
0

No CentOS 6 com o último pacote openssl (1.0.1e), você deve atualizar o nss (yum update nss) como DiegoG escreveu acima. O comando update-ca-trust também pode ser útil. Se você estiver usando curl via php - reinicie o processo / serviço do servidor da web (ou seja, serviço httpd restart).

userK
fonte