web-dev-qa-db-ja.com

PHP HTTPSでcURLが機能しない

開発サーバーで問題が発生し、cURLはHTTPで完全に機能しているが、HTTPSではまったく機能していません。異なるプロトコルのまったく同じリソースでも(テストでは、両方のhttpを使用してgoogle.comをリクエストしています)およびhttps)。

返されるcURLエラーは35です。「SSL/TLSハンドシェイクのどこかで問題が発生しました。」

私はウェブをコーミングし、SOソリューションのために、それらはすべてCURLOPT_SSL_VERIFYPEERをfalseに設定して(何も変更しない)、または証明書ファイルをダウンロードしてCURLOPT_CAINFOをそのパスに設定しました。また、何も変わりません。

証明書を設定するとき、 このチュートリアル および このチュートリアル の指示に従い、要求しているリソースの証明書のダウンロードと、証明書バンドルのダウンロードの両方を試みました。

また、CURLOP_PORTを明示的に443に設定しようとしました。質問を徹底するために、私が設定した他のオプションはCURLOPT_VERBOSE = true、CURLOPT_RETURNTRANSFER = true、およびCURLOPT_SSL_VERIFYHOST = 2です。およびfalse)。また、phpinfo()でOpenSSLが有効になっていることを確認しました。

私は最後の本番サーバーで完全に機能する多くの古いコードを使用しているため、このコードは以前に機能しました。しかし、そのホスティングは共有ホスティングであり、そこでの構成のほとんどはわかりません。

20
spezied

Curlには、ルート証明書が組み込まれていません(ほとんどの最新のブラウザーにあるような)。 cacert.pemファイルを明示的に指す必要があります。

  curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cert/file/cacert.pem');

これがないと、curlはSSL経由で返送された証明書を検証できません。 curlでSSLを使用するたびに、この同じルート証明書ファイルを使用できます。

ここでcacert.pemファイルを取得できます。 http://curl.haxx.se/docs/caextract.html

23
Ray

これはどう。 HTTPS Googleホームページである可能性のあるものを取得します。 (証明書の検証を無効にしているので、それが実際のGoogleホームページであることを実際に知る方法はありません。)それはあなたのためのトリックをするはずです。

<?PHP

// connect via SSL, but don't check cert
$handle=curl_init('https://www.google.com');
curl_setopt($handle, CURLOPT_VERBOSE, true);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
$content = curl_exec($handle);

echo $content; // show target page
?>
12
Joseph Lust

OSに証明書のディレクトリが含まれているかどうかを確認します。その場合、必要なCA証明書がすでに含まれていることがよくあります。たとえば、Ubuntuでは、通常は/etc/ssl/certs。このディレクトリが存在する場合、CAパスパラメータを設定します。

curl_setopt($ch, CURLOPT_CAPATH, '/etc/ssl/certs');

または、単一のCA証明書ファイルを参照できます。プロジェクトにcacert.pemファイルを含めるか、サーバーにインストールします。信頼できるソースからダウンロードしてください。 cacert.org。単一のファイルの場合、CAPATHを設定せずに、CAINFOのみを設定します。

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem');

ピアとホストの検証をオフにするのは簡単ですが、実際の問題に対するinsecureの回避策です。これらの機能は正当な理由で存在します。したがって、サードパーティを介して、接続しているシステムが期待どおりのものであると信頼できます。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
5
Matt S