開発サーバーで問題が発生し、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が有効になっていることを確認しました。
私は最後の本番サーバーで完全に機能する多くの古いコードを使用しているため、このコードは以前に機能しました。しかし、そのホスティングは共有ホスティングであり、そこでの構成のほとんどはわかりません。
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
これはどう。 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
?>
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);