2013-01-11 4 views
8

Im Grunde hat ich dies:Lassen Sie selbstsignierte Zertifikate für 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]"); 

Wo [A] eine URL mit einem "echten" Zertifikat auf einem Server befindet und [B] ist etwas, auf einem mit nur einem selbstsigniertes Zertifikat

Mit [A] es funktioniert gut, mit [B] Ich bekomme diese:

file_get_contents(): Failed to enable crypto 

die eine ziemlich unglückliche Fehlermeldung ist, dass so etwas wie „Server-Zertifikat Überprüfung nicht bestanden“ hätte sein sollen, aber in Ordnung. ..

nun dachte ich: „ok, [B] ist mein Testsystem - ich nicht für das Zertifikat ist egal“ und änderte den Zusammenhang in this:

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

Es should jetzt akzeptiert eine ny Serverzertifikat, sogar mein selbstsigniertes. Aber es ist immer noch das gleiche Verhalten - [A] funktioniert, [B] nicht. Warum?

Btw: Ich weiß, dass es gut mit der Curl-Erweiterung funktioniert, aber ich möchte das ohne es zu schlagen.

+0

Bitte definieren * "Mit [A] funktioniert es gut" * ... weil keiner von beiden jemals funktionieren sollte Sie haben kein '" cafile "' oder '" capath "' angegeben, um PHP mitzuteilen, welche CAs zu verwenden sind zur Peer-Verifizierung, und Sie haben selbst signierte Zertifikate nicht zugelassen [A] noch [B] könnten sich jemals erfolgreich verbinden, wenn Sie tatsächlich den genauen Code verwenden, der hier gezeigt wird. – rdlowrey

Antwort

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

file_get_contents ("https: // ...., falsch, $ SSL-Kontext);

die oben arbeitet

+1

Ich denke 'verify_peer' sollte auf' false' gesetzt werden, wenn Sie einen SSL MITM Proxy verwenden. – StanE

12

Das ist für mich gut funktioniert Viel Glück

$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

Das funktioniert anscheinend auch, wenn Sie überhaupt kein SSL haben! Ich habe es auf einem MAMP-Server ohne SSL-Setup versucht, und es hat funktioniert. Großartig, wenn Sie nur Dinge auf einem Dev-Server bewegen müssen :) – dmatamales

+0

Ich musste die Option 'verify_peer_name '=> false' hinzufügen, damit das selbstsignierte Zertifikat funktioniert – Fractalf

Verwandte Themen