web-dev-qa-db-ja.com

Curlエラー60、SSL証明書の問題:証明書チェーンの自己署名証明書

正しいAPP_ID、APP_SECRETなどを含むcurlリクエストを

  https://oauth.vk.com/access_token?client_id=APP_ID&client_secret=APP_SECRET&code=7a6fa4dff77a228eeda56603b8f53806c883f011c40b72630bb50df056f6479e52a&redirect_uri=REDIRECT_URI 

それからaccess_tokenを取得する必要がありますが、そうでない場合はFALSEとcurl_error() print次のメッセージを取得します:

60: SSL certificate problem: self signed certificate in certificate chain

私のコードは:

    // create curl resource
    $ch = curl_init();

    // set url
    curl_setopt($ch, CURLOPT_URL, $url);
    //return the transfer as a string
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    // $output contains the output string
    $output = curl_exec($ch);
    if ( ! $output) {
        print curl_errno($ch) .': '. curl_error($ch);
    }

    // close curl resource to free up system resources
    curl_close($ch);

    return $output;

上記のリンクに手動で移動すると、access_tokenが取得されます。なぜcurlで動作しないのですか?助けてください。

58

CURLOPT_SSL_VERIFYPEERを無効にすることを提案する回答は受け入れられません。問題は「なぜcURLで機能しないのか」であり、Martijn Holsが正しく指摘しているように、それは危険です。

このエラーは、CAルート証明書の最新のバンドルがないことが原因である可能性があります。これは通常、ホストのSSL証明書を検証するためにcurlが使用する一連の暗号署名を含むテキストファイルです。

PHPのインストールにこれらのファイルのいずれかが含まれていること、およびそれが最新であることを確認する必要があります(そうでない場合は、ここからダウンロードしてください。 http://curl.haxx.se/docs/ caextract.html )。

次に php.iniで設定

curl.cainfo = <absolute_path_to> cacert.pem

実行時に設定する場合は、次を使用します。

curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
149
erlangsec

この回避策は、dangerousおよび非推奨です。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

SSLピア検証を無効にすることはお勧めできません。そうすると、リクエストがMITM攻撃者にさらされる可能性があります。

実際、最新のCAルート証明書バンドルが必要です。更新されたものをインストールするのは簡単です:

  1. cURL website から最新のcacert.pemファイルをダウンロードする
  2. Php.iniファイルでパスを設定します。 Windowsの場合:

    curl.cainfo=c:\php\cacert.pem

それでおしまい!

安全性を確保します。

46
zxcmehran

皆さん、非常に重要です!この問題により、数日間夢中になり、curlとopensslのインストールで何が起こっているのかわかりませんでした。私はついに、それが私の中間証明書(私の場合はGoDaddy)が古くなっていることがわかりました。 godaddy SSL管理パネルに戻り、新しい中間証明書をダウンロードすると、問題はなくなりました。

これはあなたの一部の問題だと確信しています。

どうやら、GoDaddyは、次の警告を表示するため、セキュリティ上の問題のために、ある時点で中間証明書を変更しました。

「ダウンロードしたバンドルに含まれる新しいSHA-2中間証明書を必ず使用してください。」

これがあなたの一部を助けることを願っています、私が夢中になっていて、これが私のすべてのサーバー上の問題をクリーンアップしたので...

3
Lee

SSL証明書がシステムに適切にインストールされていない場合、次のエラーが表示される場合があります。

cURLエラー60:SSL証明書の問題:ローカル発行者証明書を取得できません。

この問題は次のように解決できます。

https://curl.haxx.se/ca/cacert.pem から更新された証明書のリストを含むファイルをダウンロードします

ダウンロードしたcacert.pemファイルをシステムの安全な場所に移動します

php.iniファイルを更新し、そのファイルへのパスを構成します。

2
sunil