2013-01-11 12 views
8

Zasadniczo mam to:Pozwól samopodpisanym certyfikatami HTTPS wrapper

function request($url) { 
    return file_get_contents($url, false, stream_context_create(array(
     "ssl" => array(
      "verify_peer" => true, 
      "allow_self_signed" => false, 
     ) 
    ))); 
} 

request("https://[A]"); 
request("https://[B]"); 

gdzie [A] jest jakiś adres na serwerze z „prawdziwym” świadectwa i [B] jest czymś, na jednym z tylko samopodpisany certyfikat.

[A] to działa dobrze, z [B] i uzyskać w ten sposób:

file_get_contents(): Failed to enable crypto 

który jest dość niefortunny komunikat o błędzie, który powinien być czymś w rodzaju „Weryfikacja certyfikatu serwera nie powiodło się”, ale w porządku. ..

teraz pomyślałem: "OK, [B] jest mój system testu - nie dbam o świadectwo" i zmienił kontekst do tego:

"verify_peer" => false, 
"allow_self_signed" => true, 

to should teraz zaakceptować ny certyfikat serwera, nawet mój własny podpis. Ale nadal zachowuje się tak samo - [A] działa, [B] nie. Czemu?


Btw: Wiem, że działa dobrze z przedłużeniem curl, ale chcę go pokonać bez niego.

+0

Proszę zdefiniować * "Z [A] to działa dobrze" * ... ponieważ żaden z nich nigdy nie powinien działać. Nie określiłeś '' cafile "' lub '" capath "' aby powiedzieć PHP jakie certyfikaty CA użyć do weryfikacji przez osoby sprawdzające i nie zezwalałeś na autopodpisywane certyfikaty [A] ani [B] nie mogą się połączyć, jeśli rzeczywiście używasz dokładnego kodu pokazanego tutaj. – rdlowrey

Odpowiedz

0
$contextOptions = array(
    'ssl' => array(
     'verify_peer'  => true, 
     'allow_self_signed'=> true 
    ) 
); 
$sslContext = stream_context_create($contextOptions); 

file_get_contents ("https: // ...., fałszywe, $ sslContext);

powyższe działa dobrze

+1

Myślę, że 'verify_peer' powinno być ustawione na 'false', jeśli używasz proxy SSL MITM. – StanE

12

Działa to dla mnie Powodzenia

$context = [ 'http' => [ 'method' => 'GET' ], 'ssl' => [ 'verify_peer' => false, 'allow_self_signed'=> true ] ]; 
$context = stream_context_create($context); 
$resp = file_get_contents('https://site/', false, $context); 
..
+1

To też najwyraźniej działa, jeśli w ogóle nie masz SSL! Próbowałem go na serwerze MAMP bez żadnego ustawienia SSL i działało. Świetne, jeśli potrzebujesz po prostu przenieść rzeczy na serwer dev :) – dmatamales

+0

Musiałem dodać opcję ''verify_peer_name' => false', aby uzyskać samopodpis-cert do pracy – Fractalf