64

cURL (最新バージョン) を使用して支払い用のセキュア ゲートウェイに接続するサイトがあります。

問題は、cURL が常に長さ 0 のコンテンツを返すことです。ヘッダーのみを取得します。そして、ヘッダーを返すようにcURLを設定した場合のみ。以下のフラグを立てています。

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_URL, $gatewayURI);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_POST, 1);

返されるヘッダーは

HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Date: Tue, 25 Nov 2008 01:08:34 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Content-Length: 0
Content-Type: text/html
Set-Cookie: ASPSESSIONIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; path=/
Cache-control: private

また、さまざまなサイトを cURL'ing しようとしましたが、それらはコンテンツを正常に返します。問題はhttps接続に関係している可能性があると思います。

私は会社と話しましたが、彼らは役に立ちません。

他の誰かがこのエラーを経験し、回避策を知っていますか? cURL を捨てて、試して使用する必要がありますfsockopen()か?

ありがとうございました。:)

4

12 に答える 12

100

今日も同じ問題がありました。Curl には、HTTPS 証明書を認証するための古いファイルが付属しています。

次から新しいものを取得します。

http://curl.haxx.se/ca/cacert.pem

サイトのディレクトリに保存します

そして追加

curl_setopt ($curl_ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem"); 

すべてのリクエストに:-)

CURLOPT_VERIFYPEER と CURLOPT_VERIFYHOST を無効にすることについての愚かなコメントは無視してください!! これにより、コードが中間者攻撃に対して脆弱になります。

2016 年 12 月の編集:

後述の Jasen の方法を使用して、これを適切に解決します。

curl.cainfo=/etc/ssl/certs/ca-certificates.crtphp.iniに追加します

2017 年 10 月の編集:

ca 証明書の管理に役立つ composer パッケージが追加されたため、証明書の失効により cacert.pem が古くなっても脆弱ではありません。

https://github.com/paragonie/certainty ->composer require paragonie/certainty:dev-master

于 2008-11-25T08:52:55.563 に答える
35

curl_error() のエラー メッセージも確認してください。これは、各 curl_* 関数の後に 1 回実行する必要がある場合があります。

http://www.php.net/curl_error

于 2008-12-03T00:47:48.770 に答える
28

注: これは厳密には本番環境での使用ではありません。すばやくデバッグしたい場合は、これが役立つ場合があります。それ以外の場合は、上記の @SchizoDuckie の回答を使用してください。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);     
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 

それらを追加するだけです。できます。

于 2010-07-21T22:43:28.173 に答える
6

非常によく似た問題があり、追加して解決しました

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

どうやら私がフェッチしているサイトは別の場所にリダイレクトされ、php-curl はデフォルトでリダイレクトに従いません。

于 2012-10-19T20:12:14.300 に答える
4

これが役立つ状況がありました:(Windows上のPHP 5.4.16)

curl_setopt($ch, CURLOPT_SSLVERSION, 3);
于 2013-06-12T00:13:00.297 に答える
3

PHP/Curl で何かをテストするときはいつでも、最初にコマンド ラインから試し、何が機能するかを判断してから、オプションを PHP に移植します。

于 2008-11-25T02:48:38.420 に答える
2

httpsでエラーが発生しないように、Curl証明書を最新バージョンにアップグレードする必要がある場合があります。

于 2010-02-05T11:24:27.030 に答える
1

私はfile_get_contentsusingを使用しstream_create_contextましたが、正常に動作します:

$postdataStr = http_build_query($postdataArr);

$context_options = array (
        'http' => array (    <blink> // this will allways be http!!!</blink>
            'method' => 'POST',
            'header'=> "Content-type: application/x-www-form-urlencoded\r\n"
                . "Content-Length: " . strlen($postdataArr) . "\r\n"
                . "Cookie: " . $cookies."\r\n"
            'content' => $postdataStr
            )
        );

$context = stream_context_create($context_options);
$HTTPSReq = file_get_contents('https://www.example.com/', false, $context);
于 2009-05-05T08:07:52.543 に答える
0

あなたがゲートウェイのための安全な通信をテストしているあなたのウェブホスティング会社で問題があるかもしれません、彼らはあなたがそれをすることを許さないかもしれません。

また、リモートホストに接続する前に提供する必要のあるユーザー名、パスワードがある場合もあります。

または、通信を開始するために、リモートサーバーの承認済みIPのリストにIPが含まれている必要がある場合があります。

于 2008-11-25T03:36:32.643 に答える
0

最近のアプリケーション プロジェクトでこのエラーを発見しました。私はコマンド ラインまたはブラウザー ウィンドウから実行するように書いていたので、要求しているドキュメントの相対 URL を取得するためにサーバー検出を使用していました。問題は、サイトが https で、 http://(同じサーバー)にアクセスしようとするたびに、cURL がそれを https に変更してくれたことです。

これはブラウザーからは正常に機能しますが、コマンドラインからは、両方の検証が false に設定されていても SSL エラーが発生します。私がしなければならなかったことは、

1) $_SERVER['HTTP_HOST'] をチェックします。存在する場合は、 ($_SERVER['HTTPS'] ? "https://" : "http://").$_SERVER['HTTP_HOST'] を使用します。

2) $_SERVER['COMPUTERNAME'] を確認し、実稼働サーバーと一致する場合は、https URL を提供します。(" https://(サーバー名) ")

3) どちらの条件も満たさない場合は、別のサーバーでコマンドラインを実行していて、" http://localhost " を使用していることを意味します。

さて、これはうまくいきましたが、ハックです。また、一方のサーバー (https) では cURL が URL を変更し、もう一方のサーバー (https) では URL がそのままになった理由がわかりませんでした。

変。

于 2009-10-06T17:32:04.450 に答える
0

https を使用してセキュリティの問題を回避する最善の方法は、Firefox (または別のツール) を使用して証明書をサーバーにダウンロードすることです。このウェブページは私を大いに助けてくれました。これらは私のために働いたステップです:

1) CURL で使用する URL を Firefox で開きます。

2) アドレスバーでpadlock>をクリックしますmore information(FF バージョンには異なるメニューがある場合があります。見つけてください)。View certificateボタン >Detailsタブをクリックします。

3) の「正しい」証明書を強調表示しCertificate hierarchyます。私の場合は、「cPanel, Inc. Certification Authority」と呼ばれる 3 つのうちの 2 番目でした。「試行錯誤」の方法で正しいものを発見しました。

4) ボタンをクリックしExportます。私の場合、機能したのはファイルタイプ「チェーン付きPEM」でした(これも試行錯誤の方法による)。

5) 次に、PHP スクリプトに以下を追加します。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);    
curl_setopt($ch, CURLOPT_CAINFO, [PATH_TO_CRT_FILE]);

さらに、これらの手順は、おそらく 1 年に 1 回、または URL 証明書が交換または更新されるたびにやり直す必要があることに注意する必要があります。

于 2017-09-10T08:50:54.067 に答える
-1

POST メソッドを使用していますが、データの配列を提供していますか? 例えば

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
于 2008-11-25T02:33:13.410 に答える