Próbuję wysłać żądanie curl z moim poprawnym APP_ID, APP_SECRET itp. Do
https://oauth.vk.com/access_token?client_id=APP_ID&client_secret=APP_SECRET&code=7a6fa4dff77a228eeda56603b8f53806c883f011c40b72630bb50df056f6479e52a&redirect_uri=REDIRECT_URI
Muszę uzyskać z niego access_token, ale otrzymuję FALSE i curl_error()
wypisuję następną wiadomość w przeciwnym razie:
60: SSL certificate problem: self signed certificate in certificate chain
Mój kod to:
// create curl resource
$ch = curl_init();
// set url
curl_setopt($ch, CURLOPT_URL, $url);
//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $output contains the output string
$output = curl_exec($ch);
if ( ! $output) {
print curl_errno($ch) .': '. curl_error($ch);
}
// close curl resource to free up system resources
curl_close($ch);
return $output;
Kiedy przechodzę ręcznie do powyższego linku, dobrze otrzymuję access_token. Dlaczego nie działa z lokami? Prosimy o pomoc.
.crt
przedłużeniem? Ale nie wiem, jak go zdobyćOdpowiedzi:
Odpowiedzi sugerujące wyłączenie
CURLOPT_SSL_VERIFYPEER
nie powinny być akceptowane. Pytanie brzmi „Dlaczego to nie działa z cURL” i jak słusznie zauważył Martijn Hols, jest to niebezpieczne.Błąd jest prawdopodobnie spowodowany brakiem aktualnego pakietu certyfikatów głównych CA. Zwykle jest to plik tekstowy z zestawem podpisów kryptograficznych, których curl używa do weryfikacji certyfikatu SSL hosta.
Musisz upewnić się, że Twoja instalacja PHP zawiera jeden z tych plików i że jest aktualny (w przeciwnym razie pobierz go tutaj: http://curl.haxx.se/docs/caextract.html ).
Następnie ustaw w php.ini :
Jeśli ustawiasz go w czasie wykonywania, użyj:
curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
źródło
To obejście jest niebezpieczne i nie jest zalecane :
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Nie jest dobrym pomysłem wyłączanie weryfikacji SSL na poziomie równorzędnym. Może to narazić Twoje żądania na atakujące MITM.
W rzeczywistości potrzebujesz tylko aktualnego pakietu certyfikatów głównych CA. Zainstalowanie zaktualizowanej wersji jest tak proste, jak:
Pobieranie aktualnego
cacert.pem
pliku ze strony cURL iUstawienie ścieżki do niego w pliku php.ini, np. W systemie Windows:
curl.cainfo=c:\php\cacert.pem
Otóż to!
Bądź bezpieczny.
źródło
php.ini
pliku globalnego :curl_setopt ($curl_ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
Jeśli certyfikaty SSL nie są poprawnie zainstalowane w twoim systemie, możesz otrzymać ten błąd:
Możesz rozwiązać ten problem w następujący sposób:
Pobierz plik ze zaktualizowaną listą certyfikatów z https://curl.haxx.se/ca/cacert.pem
Przenieś pobrany
cacert.pem
plik w jakieś bezpieczne miejsce w systemieZaktualizuj
php.ini
plik i skonfiguruj ścieżkę do tego pliku:źródło
openssl.cafile="C:/dev/ssl/mywebsite.local.crt"
w php.iniWażne: ten problem doprowadzał mnie do szału na kilka dni i nie mogłem dowiedzieć się, co się dzieje z moimi instalacjami curl i openssl. W końcu zorientowałem się, że to mój pośredni certyfikat (w moim przypadku GoDaddy) był nieaktualny. Wróciłem do panelu administracyjnego SSL godaddy, pobrałem nowy certyfikat pośredni i problem zniknął.
Jestem pewien, że to jest problem dla niektórych z was.
Najwyraźniej GoDaddy zmienił w pewnym momencie swój certyfikat pośredni z powodu problemów z bezpieczeństwem, ponieważ teraz wyświetla to ostrzeżenie:
„Pamiętaj, aby używać nowych certyfikatów pośrednich SHA-2 zawartych w pobranym pakiecie”.
Mam nadzieję, że to pomoże niektórym z was, ponieważ oszalałem i to rozwiązało problem na WSZYSTKICH moich serwerach.
źródło
Solution: curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_FAILONERROR, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
źródło