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 CERTIFICATE
i 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 CERTIFICATE
i zapisałem go w .crt
pliku - nazwałam go my-ca.crt
(również próbowałem tego samego, nazywając go jako my-ca.pem
plik), 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.
źródło
--insecure
aby zignorować błąd SSL.Odpowiedzi:
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
-k
flagę do połączenia, aby umożliwić niezabezpieczone połączenia.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 -k
poprawki.źródło
Proste rozwiązanie
To mój codzienny skrypt:
Wynik:
źródło
--insecure
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.
Napisałem bloga o tym, jak to zrobić, tutaj: http://javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html
źródło
użyj
--cacert
do określenia.crt
pliku.ca-root-nss.crt
na przykład.źródło
Właściwie miałem tego rodzaju problem i rozwiązuję go w następujący sposób:
Pobierz pakiet certyfikatów głównego urzędu certyfikacji stąd: https://curl.haxx.se/ca/cacert.pem i zapisz go na lokalnym
Znajdź
php.ini
plikUstaw
curl.cainfo
jako ścieżkę certyfikatów. Więc będzie to coś takiego:curl.cainfo = /path/of/the/keys/cacert.pem
źródło
Tutaj można znaleźć certyfikatów CA z instrukcjami, aby pobrać i konwertować Mozilla CA certyfikatów . Gdy otrzymasz
ca-bundle.crt
lubcacert.pem
po prostu użyj:lub
źródło
po usunięciu problemu mogłem użyć istniejącego domyślnego pliku CA systemu, na debian6 jest to:
jako root można to zrobić na przykład:
następnie ponownie uruchom serwer WWW.
źródło
możesz tego użyć
curl_setopt($curl->curl, CURLOPT_SSL_VERIFYPEER, false);
źródło
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.04
curl 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>
źródło
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)
Inny przykład, aby połączyć się z określonym serwerem zaplecza o nazwie backend1 na porcie 8080
Pamiętaj, aby dodać nagłówek hosta, jeśli serwer potrzebuje tego do poprawnej odpowiedzi:
źródło