2013-09-24 9 views
15

Używałem cURLa na moim lokalnym hoście przez najdłuższy czas i nagle zauważyłem, że to już nie działa, chyba że wyraźnie ustawię opcję, CURLOPT_SSL_VERIFYPEER = FALSE.cURL wymaga CURLOPT_SSL_VERIFYPEER = FALSE

Nie mam pojęcia jak/kiedy to się zmieniło, ale używam NGINX i PHP i mogę zweryfikować, że nie jest to specyficzny problem dla konkretnego hosta. Otrzymuję puste odpowiedzi od https://site1.com i https://different-site.com.

Ktoś ma jakieś myśli?

+0

Uwielbiam ten [ukryty klejnot] (http://stackoverflow.com/a/12293898/), wyjaśnia, w jaki sposób można używać certyfikatów do weryfikowania hostów. –

+0

http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/ – Young

+0

@DaveChen i - @ Młode dzięki, ale czy masz rozumiem, dlaczego wcześniej nie potrzebowałem dostarczać certyfikatu, ale czy teraz? –

Odpowiedz

28

Dzięki sugestiom Dave'a Chena zdałem sobie sprawę, że muszę zgubić mój certyfikat. Problem został rozwiązany przez tego certyfikatu, który jest przewidziany przez cURL Autor: http://curl.haxx.se/ca/cacert.pem

Więc po pobraniu tego pliku cacert.pem do projektu, w PHP można to zrobić teraz:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
curl_setopt($ch, CURLOPT_CAINFO, "/path/to/cacert.pem"); 

Alternatywnie, można ustawić globalnie poprzez dodanie następujących do php.ini

curl.cainfo=/path/to/cacert.pem 
+0

Świetnie, to działało dla mnie! – Contango

+5

Nie jestem ekspertem od bezpieczeństwa, ale ściągam niepoprawne źródło pliku .pem (http :) można zaufać? – Gihan

+0

Próbowano w obie strony. Żaden nie zadziałał. – LXXIII

1

można to zrobić:

curl_setopt ($ ch, CURLOPT_SSL_VERI FYPEER, true);
curl_setopt ($ ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt ($ ch, CURLOPT_CAINFO, getcwd(). "/path/cert.pem");

Inną opcją podaję, CURLOPT_SSL_VERIFYHOST można ustawić następujące wartości:

0: Nie sprawdzić nazwę pospolitą (CN) atrybut
1: Sprawdź, czy atrybut nazwa zwyczajowa w najmniej istnieje
2: Sprawdź, czy nazwa zwyczajowa istnieje i że jest zgodna z nazwą hosta serwera

Jeśli masz CURLOPT_SSL_VERIFYPEER ustawiona na false, wówczas z punktu widzenia bezpieczeństwa, to naprawdę nie ma znaczenia, co masz ustaw CURLOPT_SSL_VERIFYHOST na, ponieważ bez weryfikacji certyfikatu rówieśniczego serwer może używać a ny certyfikat, w tym samopodpisany, z gwarancją posiadania CN pasującego do nazwy hosta serwera. Tak więc to ustawienie jest istotne tylko wtedy, gdy włączysz weryfikację certyfikatu.

1

Jeśli używasz -WampSerwer, to zauważyć:

Musisz umieścić bezwzględną ścieżkę w CURLOPT_CAINFO, na przykład:

curl_setopt ($ch, CURLOPT_CAINFO, 'C:\wamp\www\your-project\cacert.pem') 

Nie używać ścieżki względnej: curl_setopt ($ ch, CURLOPT_CAINFO, "cacert.pem") , ponieważ nie działa.