/ / curl Błąd certyfikatu SSL: niepowodzenie weryfikacji - ssl, curl, https, ssl-certificate

zwiń błąd certyfikatu SSL: niepowodzenie weryfikacji - ssl, curl, https, certyfikat ssl

Pomóż mi zrozumieć, dlaczego nie mogę pomyślnie zawinąć tego adresu URL za pomocą https:

Używam Ubuntu 12.04.5 z curl 7.22.0, libcurl 7.22.0 i OpenSSL 1.0.1-4ubuntu5.25

$ curl -v https://www.onevanilla.com/
* About to connect() to www.onevanilla.com port 443 (#0)
*   Trying 199.83.128.4... connected
* successfully set certificate verify locations:
*   CAfile: none
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
* Closing connection #0
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Próbuję więc ręcznie uzyskać certyfikat:

$ openssl s_client -connect www.onevanilla.com:443 </dev/null | sed -ne "/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p" > /tmp/www.onevanilla.com.pem

i wtedy:

$ curl -v --cacert /tmp/www.onevanilla.com.pem https://www.onevanilla.com

ale mam taki sam wynik:

* About to connect() to www.onevanilla.com port 443 (#0)
*   Trying 199.83.128.4... connected
* successfully set certificate verify locations:
*   CAfile: /tmp/www.onevanilla.com.pem
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
* Closing connection #0
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Mogę zweryfikować certyfikat za pomocą openssl:

$ openssl s_client -host www.onevanilla.com -port 443 -CApath /etc/ssl/certs

i to wraca Verify return code: 0 (ok)

Ja też biegnąłem sudo update-ca-certificates --fresh dla pewności, ale bez szczęścia.

Więc wydaje mi się, że cert jest prawidłowy (nie wygasł, nazwa hosta pasuje do CN), ale nigdy nie uda mi się uzyskać pozytywnej odpowiedzi za pomocą curl (chyba że oczywiście używam -k lub --insecure opcje). Czy ktoś może wyjaśnić?

Odpowiedzi:

2 dla odpowiedzi № 1

Wystąpił problem spowodowany długotrwałym problemem, w którym OpenSSL nie obsługuje poprawnie sytuacji z wieloma ścieżkami zaufania. raport z SSLLabs zobaczysz, że serwer udostępnia następujący łańcuch:

[0] /O=www.onevanilla.com/OU=Domain Control Validated/CN=www.onevanilla.com SAN=DNS:www.onevanilla.com,DNS:onevanilla.com
[1] /C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certificates.godaddy.com/repository/CN=Go Daddy Secure Certification Authority/serialNumber=07969287
[2] /C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
[3] /L=ValiCert Validation Network/O=ValiCert, Inc./OU=ValiCert Class 2 Policy Validation Authority/CN=http://www.valicert.com//emailAddress=info@valicert.com

Przeglądarki zawierają certyfikat główny dla Go Daddy Class 2 Certification Authority i dlatego może zbudować ścieżkę zaufania z [0], [1] icertyfikat główny, a tym samym zignorują certyfikaty [2] i [3]. Zamiast tego OpenSSL zignoruje tylko certyfikat [3], ponieważ jest samopodpisany i dlatego nie powinien być w ogóle uwzględniany w łańcuchu. Następnie spróbuje zweryfikować łańcuch [0], [1], [2] i zakończy się niepowodzeniem, ponieważ nie znajdzie podpisu certyfikatu głównego [2]. Zamiast tego nie będzie próbował zweryfikować krótszego łańcucha [0], [1].

Aby uzyskać więcej informacji na temat tego problemu, zobacz Błąd Python Urllib2 SSL i http://kriscience.blogspot.de/2013/03/supporting-trusted-but-untrusted.html i raport o błędzie OpenSSL.

Co możesz zrobić: uzyskać brakujący certyfikat https://certs.godaddy.com/repository/valicert_class2_root.crt i używaj go w --cacert parametr.


1 dla odpowiedzi nr 2

Curl --cacert <cert> opcja służy do określenia a urząd certyfikacji użyć do zweryfikowania certyfikatu serwera. Certyfikat skopiowany z s_client wyjście to certyfikat serwerai używając go jako --cacert argument nie powiedzie się, ponieważ certyfikat serwera nie jest samopodpisany, ale podpisany przez inny urząd certyfikacji (w twoim przypadku, Go Daddy).

Wywołaj zwijanie za pomocą --capath opcja określenia zaufanego głównego urzędu certyfikacji. Jest to analogiczne do s_client -CApath <dir> opcja.

$ curl -v --capath /etc/ssl/certs https://www.onevanilla.com