2013-01-11 190 views
8

基本上我有這樣的:允許HTTPS自簽名證書包裝

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]"); 

其中[A]是一個服務器上的某些URL與「真正的」證書和[B]是什麼在一個只有一個自簽名證書。

用[A]它做工精細,用[B]我得到這個:

file_get_contents(): Failed to enable crypto 

這是本來應該像「服務器證書驗證失敗」,但罰款,而不幸的錯誤消息。 ..

現在我想了想道:「好了,[B]是我的測試系統 - 我不在乎證書」,改變的背景下進入這個:

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

should現在接受ny服務器證書,甚至是我自己簽署的證書。但它仍然是一樣的行爲 - [A]起作用,[B]不起作用。爲什麼?


順便說一句:我知道它適用於捲曲擴展,但我想打敗它沒有它。

+0

請定義*「With [A] it fine fine」* ...因爲這兩者都不應該工作,您沒有指定''cafile''或''capath''告訴PHP要使用哪些CA證書對於同行驗證,您已經禁止使用自簽名證書如果您確實使用了此處顯示的確切代碼,[A]和[B]都無法成功連接。 – rdlowrey

回答

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

的file_get_contents(「https://開頭....,虛假,$的SSLContext);

上述工作正常

+1

如果您使用SSL MITM代理,我認爲'verify_peer'應該設置爲'false'。 – StanE

12

這對我的作品好運

$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

如果您完全沒有SSL,這也顯然可行!我在沒有SSL設置的MAMP服務器上嘗試過它,並且它工作正常。太好了,如果你只是需要讓事情在開發服務器上移動:) – dmatamales

+0

我必須添加選項''verify_peer_name'=> false'才能使自簽名證書正常工作 – Fractalf