Połączenie https za pomocą CURL z wiersza poleceń

127

Jestem nowy w świecie Curl i Cacerts i mam problem podczas łączenia się z serwerem. Zasadniczo muszę przetestować łączność przez https z jednego komputera na inny. Mam adres URL, z którym muszę się połączyć z komputera A (komputer z systemem Linux). Próbowałem tego w wierszu polecenia

cmd> curl https://[my domain or IP address]

i otrzymałem:

curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Przeglądając kilka artykułów w Internecie, zrobiłem to:

openssl s_client -connect <domain name or Ip address>:443

i otrzymałem odpowiedź, w tym certyfikat serwera (w środku -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----).

Co mam teraz zrobić. Myślę, że będę musiał po prostu skopiować, wkleić tekst do środka BEGIN CERTIFICATE & END CERTIFICATEi zapisać go w pliku. Ale jaki to powinien być typ pliku? .pem, .crt? .. Co powinienem zrobić po tym?

Spróbowałem tego - skopiowałem tekst w środku BEGIN CERTIFICATE & END CERTIFICATEi zapisałem go w .crtpliku - nazwałam go my-ca.crt(również próbowałem tego samego, nazywając go jako my-ca.pemplik), a następnie zrobiłem to:

cmd>curl --cacert my-ca.crt https://[my domain or IP address]

Ale dostałem ten sam błąd.

user1270392
źródło
Nie jestem pewien rozwiązania, które sugerujesz, ale szukałem podobnych informacji i znalazłem tę przydatną stronę do używania curl z PHP unitstep.net/blog/2009/05/05/ ...
MauroPerez
1
możesz również dodać, --insecureaby zignorować błąd SSL.
Alexej Magura
nowsze wersje curl (np. 7.64) nie rozpoznawały starszych szyfrów, takich jak RC4-SHA - użycie starszej wersji curl (7.46) pomogło mi serverfault.com/questions/889631/…
hello_earth

Odpowiedzi:

142

Miałem ten sam problem - pobierałem stronę z mojej własnej witryny, która była obsługiwana przez HTTPS, ale curl wyświetlał ten sam komunikat „Problem z certyfikatem SSL”. Obejrzałem to, dodając -kflagę do połączenia, aby umożliwić niezabezpieczone połączenia.

curl -k https://whatever.com/script.php

Edycja: odkryłem źródło problemu. Używałem certyfikatu SSL (ze StartSSL, ale nie sądzę, żeby to miało duże znaczenie) i nie ustawiłem poprawnie certyfikatu pośredniego. Jeśli masz ten sam problem co powyższy użytkownik1270392, prawdopodobnie dobrym pomysłem jest przetestowanie certyfikatu SSL i naprawienie wszelkich problemów z nim przed skorzystaniem z curl -kpoprawki.

Dave Child
źródło
5
Flaga -k to fajny skrót. Pracował dla mnie!
tidydee
45

Proste rozwiązanie

To mój codzienny skrypt:

curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'

Wynik:

* Server certificate:
*    subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=www.google.com
*    start date: 2016-01-07 11:34:33 GMT
*    expire date: 2016-04-06 00:00:00 GMT
*    issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*    SSL certificate verify ok.
* Server GFE/2.0 is not blacklisted
* Connection #0 to host www.google.com left intact
Antonio Feitosa
źródło
11
Zatem --insecure
zezwalasz
2
@Brethlosze Dzięki za komentarz. Ale tak nie jest. Chodzi o to, aby uzyskać informacje SSL z wszelkiego rodzaju certyfikatów.
Antonio Feitosa
30

Musisz dostarczyć cały łańcuch certyfikatów do zawinięcia, ponieważ curl nie jest już dostarczany z żadnymi certyfikatami CA. Ponieważ opcja cacert może używać tylko jednego pliku, musisz połączyć pełne informacje o łańcuchu w 1 plik

Skopiuj łańcuch certyfikatów (na przykład z przeglądarki) do binarnego kodu DER x.509 (.cer). Zrób to dla każdego certyfikatu.

Przekonwertuj certyfikaty na PEM i połącz je w 1 plik.

openssl x509 -inform DES -in file1.cer -out file1.pem -text
openssl x509 -inform DES -in file2.cer -out file2.pem -text
openssl x509 -inform DES -in file3.cer -out file3.pem -text

cat *.pem > certRepo

curl --cacert certRepo -u user:passwd -X GET -H 'Content-Type: application/json' "https//somesecureserver.com/rest/field"

Napisałem bloga o tym, jak to zrobić, tutaj: http://javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html

Somaiah Kumbera
źródło
1
Czy możesz wyjaśnić cel przekazywania nazwy użytkownika i hasła? Co jeśli piszę klienta Java, czy muszę w takim przypadku podać nazwę użytkownika i hasło w nagłówku żądania GET?
Shubhi224,
@ Shubhi224 nie, jeśli twój serwer https nie wymaga prostego uwierzytelniania dla żądań GET. Musiałem użyć uwierzytelniania, ponieważ wymagało tego wywołanie REST.
Somaiah Kumbera,
Jak wspomniano w tej odpowiedzi, „Musisz dostarczyć cały łańcuch certyfikatów do zawinięcia, ponieważ curl nie jest już dostarczany z żadnymi certyfikatami CA”.
Mohamed Bana
16

użyj --cacertdo określenia .crtpliku. ca-root-nss.crtna przykład.

nie
źródło
6

Właściwie miałem tego rodzaju problem i rozwiązuję go w następujący sposób:

  1. Pobierz pakiet certyfikatów głównego urzędu certyfikacji stąd: https://curl.haxx.se/ca/cacert.pem i zapisz go na lokalnym

  2. Znajdź php.iniplik

  3. Ustaw curl.cainfojako ścieżkę certyfikatów. Więc będzie to coś takiego:

curl.cainfo = /path/of/the/keys/cacert.pem

geckob
źródło
1

po usunięciu problemu mogłem użyć istniejącego domyślnego pliku CA systemu, na debian6 jest to:

/etc/ssl/certs/ca-certificates.crt

jako root można to zrobić na przykład:

echo curl.cainfo=/etc/ssl/certs/ca-certificates.crt >> /etc/php5/mods-available/curl.ini

następnie ponownie uruchom serwer WWW.

Jasen
źródło
1

możesz tego użyć

curl_setopt($curl->curl, CURLOPT_SSL_VERIFYPEER, false);

Ahmed Ali
źródło
0

Chciałem tylko przetestować witrynę, która miała automatyczne przekierowanie http-> https. Myślę, że mam już zainstalowane certyfikaty, więc to samo działa dla mnie na Ubuntu 16.04curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3

curl --proto-default https <target>

SamCyanide
źródło
-3

W nowoczesnych wersjach curl możesz po prostu zmienić adres IP, z którym chcesz się połączyć, używając --resolve lub --connect-to (curl nowszy niż wersja 7.49). Działa to nawet z SSL / SNI. Wszystkie szczegóły znajdują się na stronie podręcznika.

Na przykład, aby zastąpić DNS i połączyć się z www.example.com za pomocą ssl, używając określonego adresu IP: (spowoduje to również zastąpienie ipv6)

curl --resolve www.example.com:443:192.168.42.2 https://www.example.com/

Inny przykład, aby połączyć się z określonym serwerem zaplecza o nazwie backend1 na porcie 8080

curl --connect-to www.example.com:80:backend1.example.com:8080 http://www.example.com/

Pamiętaj, aby dodać nagłówek hosta, jeśli serwer potrzebuje tego do poprawnej odpowiedzi:

-H 'Host:www.example.com' 
ingvarha
źródło
Nie jestem pewien, jak to odpowiada na pytanie.
Brethlosze