3

SSL を使用しないテスト リージョンで動作する次のコードがありますが、本番システムでは動作しません。呼び出し自体はブラウザーで機能しますが、cURL 経由で実行すると 500 エラーが発生します。

$region = "https://api.mysite.com/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . "/cacert.pem");
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_URL, $region . $api);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
$resp = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch); 

return $resp; 

CURL_OPT_FAILONERROR を入力しない場合、エラーは発生せず、空白の応答が返されます。これはhttps経由であるという事実に関係していると確信しています(これが私のテスト地域と現在の地域の唯一の違いであるため)が、これを機能させる方法がわかりません。

4

4 に答える 4

1

最初の問題が ssl によるものかどうかを確認するには、次を確認してください。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

それでうまくいきますか?

于 2012-06-01T10:25:49.447 に答える
0

あなたが説明したことから、おそらく問題は証明書の照合にあります。試す:

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

明らかに、これは問題の「解決策」ではありませんが、トラブルシューティングには役立ちます。

頑張ってください!

于 2012-05-25T22:28:13.707 に答える
0

次のようなものを試してください

<?php

error_reporting(E_ALL);

ini_set("display_errors", 1);

$data = array(
    CURLOPT_CAINFO => "/Users/davidmann/Documents/facebook.pem", 
    CURLOPT_SSL_VERIFYHOST => 1,
    CURLOPT_SSL_VERIFYPEER => true
);

echo var_dump(curl_get('https://www.facebook.com/', array('Refferer' => 'https://www.facebook.com/'), $data));

/** 
 * Send a GET requst using cURL 
 * @param string $url to request 
 * @param array $get values to send 
 * @param array $options for cURL 
 * @return string 
 * @author David from Code2Design.com
 * @link http://au.php.net/manual/en/function.curl-exec.php#98628
 */ 
function curl_get($url, array $get = NULL, array $options = array()) 
{    
    $defaults = array( 
        CURLOPT_URL => $url. (strpos($url, '?') === FALSE ? '?' : ''). http_build_query($get), 
        CURLOPT_HEADER => 1, 
        CURLOPT_RETURNTRANSFER => TRUE, 
        CURLOPT_TIMEOUT => 4 
    ); 

    $ch = curl_init(); 
    curl_setopt_array($ch, ($options + $defaults)); 
    if( ! $result = curl_exec($ch)) 
    { 
        trigger_error(curl_error($ch)); 
    } 
    curl_close($ch); 
    return $result; 
} 

次に、アクセスしている Web サイトから証明書をダウンロードします (firefox を開いてhttps://site.comに移動し、右クリックしてページ情報を表示し、セキュリティ タブ、証明書を表示し、最上位の証明書を選択し、x.509 としてエクスポートしてから更新を使用します)。のCURLOPT_CAINFO

これが役に立てば幸いです、デイブ

于 2012-05-25T23:06:36.137 に答える
0

CURLOPT_REFERER と CURLOPT_USERAGENT を設定してみてください。私は同じ問題を抱えていましたが、これで解決しました。

于 2013-11-06T09:51:15.073 に答える