web-dev-qa-db-ja.com

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

私は地元の開発環境でWAMPを使用しており、クレジットカードに請求しようとしていますが、エラーメッセージが表示されます。

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

私はグーグルで多くのことを調べました、そして、私はこのファイルをダウンロードすることを提案しています: cacert.pem 、どこかに置いて私のphp.iniでそれを参照してください。これは私のphp.iniの一部です。

curl.cainfo = "C:\Windows\cacert.pem"

それでも、サーバを数回再起動してパスを変更した後でも、同じエラーメッセージが表示されます。

私はApacheモジュールのWAMPを使い、ssl_moduleを有効にしています。そしてPGP拡張から私はphp_curlを有効にしました。

それでも同じエラーメッセージです。なぜそれが起こっているのですか?

今私はこの修正に従っています: PHP CURL Error 60 SSLの修正方法 /

これは、cURLオプションにこれらの行を追加することを示唆しています。

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);

CURLにオプションを追加する場所私のCLIはコマンド "curl_setopt"を見つけられないので、どうやらコマンドラインからではない

_編集_

これは私が実行しているコードです:

public function chargeStripe()
{
    $stripe = new Stripe;
    $stripe = Stripe::make(env('STRIPE_PUBLIC_KEY'));

    $charge = $stripe->charges()->create([
        'amount'   => 2900,
        'customer' => Input::get('stripeEmail'),
        'currency' => 'EUR',
    ]);

    dd($charge);

    // echo $charge[Input::get('stripeToken')];


    return Redirect::route('step1');
}
179

実用的な解決策:

  • ウィンドウ上で仮定

XAMPPサーバ

他の環境と同様 - cacert.pemのダウンロードと解凍はこちら(クリーンファイル形式/データ)

https://curl.haxx.se/docs/caextract.html

  • ここに置いてください

C:\ xampp\php\extras\ssl\cacert.pem

  • あなたのphp.iniでこのセクションにこの行を入れてください( "c:\ xampp\php\php.ini"):
;;;;;;;;;;;;;;;;;;;;
; php.ini Options  ;
;;;;;;;;;;;;;;;;;;;;

curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
  • ウェブサーバーを再起動します/ Apache

問題が解決しました!

(出典: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate

439
Dung

GuzzleでPHP 5.6を使用している場合、Guzzleはプロセスではなく証明書にPHPライブラリの自動検出を使用するように切り替えました( ref )。 PHPは変更の概要を示します ここ

PHP/Guzzleが証明書を探している場所を見つける

PHPが使用している場所をダンプすることができます。

 var_dump(openssl_get_cert_locations());

証明書バンドルの入手

OS Xのテストでは、自作を使用してopenssl brew install opensslをインストールしてから、php.iniまたはZend Serverの設定でopenssl.cafile=/usr/local/etc/openssl/cert.pemを使用することができます(OpenSSLの下)。

証明書バンドルはcurl/Mozillaのcurl Webサイトからも入手できます。 https://curl.haxx.se/docs/caextract.html

証明書がどこにあるかをPHPに伝える

バンドルを入手したら、PHPがすでに見ている場所(上記で確認済み)に配置するか、php.iniのopenssl.cafileを更新します。 (一般的に、Unixでは/etc/php.ini/etc/php/7.0/cli/php.ini、または/etc/php/php.ini。)

37
Loren

注意Wamp/Wordpress/windowsユーザー。私は間違ったphp.iniファイルを編集していたので、問題はWAMPユーザー向けではなくXAMPP向けではなかったため、この問題は何時間も続き、正しい答えでもありませんでした。

これが私がしたことです

証明書バンドルをダウンロードしてください。

C:\wamp64\bin\php\your php version\extras\sslの中に入れてください

ファイルmod_ssl.soC:\wamp64\bin\Apache\apache(version)\modulesの内側にあることを確認してください

Apacheディレクトリmod_ssl内のhttpd.confC:\wamp64\bin\Apache\apache2.4.27\confを有効にします。

php_openssl.dllphp.iniを有効にします。私の問題は、私が2つのphp.iniファイルを持っていて、それらの両方でこれをする必要があるということでした。 1つ目はWAMPのタスクバーアイコンの内側にあります。

enter image description here

もう1つはC:\wamp64\bin\php\php(Version)にあります。

両方のphp.iniファイルの場所を見つけ、行curl.cainfo =を見つけて、それに次のようなパスを付けます。

curl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem"

それではファイルを保存してサーバーを再起動してください。

26
Rami Nour

cartalyst/stripe によって使用されるGuzzleは、サーバ証明書を照合するために適切な証明書アーカイブを見つけるために次のことを行います。

  1. Php.iniファイルにopenssl.cafileが設定されているか確認してください。
  2. Php.iniファイルにcurl.cainfoが設定されているか確認してください。
  3. /etc/pki/tls/certs/ca-bundle.crtが存在するかどうかを確認してください(Red Hat、CentOS、Fedora、ca-certificatesパッケージで提供)
  4. /etc/ssl/certs/ca-certificates.crtが存在するか確認してください(Ubuntu、Debian、ca-certificatesパッケージで提供されます)
  5. /usr/local/share/certs/ca-root-nss.crtが存在するかどうか確認してください(FreeBSD、ca_root_nssパッケージによって提供されます)
  6. /usr/local/etc/openssl/cert.pemかどうかを確認します(OS X、自作製)。
  7. C:\windows\system32\curl-ca-bundle.crtが存在するか確認してください(Windows)
  8. C:\windows\curl-ca-bundle.crtが存在するか確認してください(Windows)

簡単なテストを行って、最初の2つの設定の値が正しく定義されていることを確認してください。

echo "openssl.cafile: ", ini_get('openssl.cafile'), "\n";
echo "curl.cainfo: ", ini_get('curl.cainfo'), "\n";

または、#7または#8で示される場所にファイルを書き込もうとします。

13
Ja͢ck

Php.iniを変更できない場合は、次のようなコードからcacert.pemファイルを指すこともできます。

$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);
10
mvandillen

私がしたことはどんなphpスクリプトでもvar_dump(openssl_get_cert_locations()); die;を使うことでした。それは私のローカルphpが使っていたデフォルトについての情報を私に与えました:

array (size=8)
  'default_cert_file' => string 'c:/openssl-1.0.1c/ssl/cert.pem' (length=30)
  'default_cert_file_env' => string 'SSL_CERT_FILE' (length=13)
  'default_cert_dir' => string 'c:/openssl-1.0.1c/ssl/certs' (length=27)
  'default_cert_dir_env' => string 'SSL_CERT_DIR' (length=12)
  'default_private_dir' => string 'c:/openssl-1.0.1c/ssl/private' (length=29)
  'default_default_cert_area' => string 'c:/openssl-1.0.1c/ssl' (length=21)
  'ini_cafile' => string 'E:\xampp\php\extras\ssl\cacert.pem' (length=34)
  'ini_capath' => string '' (length=0)

お気づきのように、私はini_cafileまたはiniオプションcurl.cainfoを設定しました。しかし私の場合、curlは存在しない "default_cert_file"を使おうとします。

このファイルを https://curl.haxx.se/ca/cacert.pem から「default_cert_file」の場所(c:/openssl-1.0.1c/ssl/cert.pem)にコピーしてそれを働かせることができます。

これが私にとって唯一の解決策でした。

6
George Donev

私は私のために働いた解決策を見つけました。私は最新のゲームからバージョン4.0にダウングレードしましたが、うまくいきました。

Composer.jsonに "guzzlehttp/guzzle"を追加してください: "〜4.0"

誰かに役立つことを願っています

5
Iruku Kagika

私は、Guzzle(5)スクリプトがSSLを介してホストに接続しようとしていたときに、この問題を解決しました。もちろん、Guzzle/CurlのVERIFYオプションを無効にすることはできますが、それは明らかに正しい方法ではありません。

私は試してみました すべて ここにそして同様のスレッドでリストアップして、そして最終的に私が接続しようとしていたドメインに対してテストするためにopensslで端末に行きました:

openssl s_client -connect example.com:443 

...そして、最初の数行が次のことを示しています。

CONNECTED(00000003)
depth=0 CN = example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = example.com
verify error:num=21:unable to verify the first certificate
verify return:1 

...他の目的地(例:google.comなど)を試す際には、すべて問題なく機能していました。

これは私が接続しようとしていたドメインに連絡することを私に促しました、そして、確かに、彼らはしわになった彼らの問題で問題を抱えていました。それは解決され、私のスクリプトは機能するようになりました。

あなたの髪の毛を引き抜いているのであれば... opensslに一撃を与えて、接続しようとしている場所からの応答に何か問題があるかどうかを確認してください。たぶん問題はそんなに 'ローカル'ではないことがあります。

5
Daydream Nation

必ずphp.iniファイルをウィンドウエクスプローラで直接開いてください。 (私の場合はC:\DevPrograms\wamp64\bin\php\php5.6.25).

システムトレイのWamp/Xampアイコンのメニューにあるphp.iniへのショートカットを使用しないでください。この場合、このショートカットは機能しません。

それからそのphp.iniを編集します。

curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem" 

そして

openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"

php.iniを保存した後は、Wampアイコンで "Restart All Services"を実行したり、CMDを閉じたり再度開いたりする必要はありません。

1

私はguzzlehttp/guzzle作曲家パッケージを使うLaravel 4 phpフレームワークでも同じ問題を経験したところです。何らかの理由で、mailgunのSSL証明書が突然検証されなくなり、同じ「エラー60」メッセージが表示されました。

私のように、あなたがphp.iniにアクセスできない共有ホスティングをしているのであれば、他の解決策は不可能です。いずれにせよ、Guzzleはこのクライアントにphp.ini効果を無効にする可能性が最も高いコードを初期化させます:

// vendor/guzzlehttp/guzzle/src/Client.php
    $settings = [
        'allow_redirects' => true,
        'exceptions'      => true,
        'decode_content'  => true,
        'verify'          => __DIR__ . '/cacert.pem'
    ];

ここでGuzzleは cURLの環境 で提供されているものを使うのではなく、おそらく現在は古くなっているそれ自身の内部cacert.pemファイルの使用を強制します。この行を(少なくともLinux上で)変更すると、GuzzleはcURLのデフォルトのSSL検証ロジックを使用するように設定され、私の問題が修正されました。

        'verify'          => true

SSL接続のセキュリティを気にしないのであれば、これをfalseに設定することもできますが、それは良い解決策ではありません。

vendorの中のファイルは改ざんされることを意図していないので、より良い解決策は Guzzleクライアントの設定 を使うことですが、これはLaravel 4でやるのは非常に困難でした。

これが他の誰かに数時間のデバッグを節約することを願っています...

1
bernie

これはEdgeのケースかもしれませんが、私の場合は問題はclient conf(すでにcurl.cainfoで設定されたphp.ini)ではなく、むしろリモートではサーバーが正しく構成されていません。

チェーン内の中間certsは送信されませんでした。 Chromeを使用してサイトを閲覧する際にエラーは発生しませんでしたが、PHPを使用すると、以下のエラーが発生しました。

cURLエラー60

リモートWebサーバの設定にIntermediate Certsを含めた後はうまくいきました。

このサイトを使用してサーバーのSSL構成を確認できます。

https://whatsmychaincert.com/ /

1
Tobias K.

私はこの問題を理解するのにあまりにも多くの時間を費やしました。

PHPバージョン5.5があり、5.6にアップグレードする必要がありました。

5.6より前のバージョンではGuzzleはそれ自身のcacert.pemファイルを使用しますが、PHPの上位バージョンではシステムのcacert.pemファイルを使用します。

私はまたここからファイルをダウンロードしました https://curl.haxx.se/docs/caextract.html そしてphp.iniでそれを設定します。

答えはGuzzles StreamHandler.phpファイルにあります https://github.com/guzzle/guzzle/blob/0773d442aa96baf19d7195f14ba6e9c2da11f8ed/src/Handler/StreamHandler.php#L437

        // PHP 5.6 or greater will find the system cert by default. When
        // < 5.6, use the Guzzle bundled cacert.
1

答えはすべて正しいです。 しかし最も重要なこと あなたは正しいphp.iniファイルを見つける必要があります。 cmdでこのコマンドをチェックしてください "php --ini"は正しい答えではありません 正しいphp.iniファイルを見つけるために。

編集した場合

curl.cainfo ="PATH/cacert.pem"

そしてチェック

var_dump(openssl_get_cert_locations()); 

そしてcurl.cainfoは値を持つべきです。 そうでない場合、それは正しくないphp.iniファイルです。

* wamp/binまたはxxamp/binまたは使用している任意のサーバーで* .iniを検索し、それらを1つずつ変更して確認することをお勧めします。 *

0
Mohsen Molaei

やってみました..

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);

信頼できる情報源を消費しているのであれば、おそらくSSL証明書を検証する必要はありません。

0
Mike Miller

'var_dump(php_ini_loaded_file());'を実行すると、この出力が自分のページに表示されます'C:\Development\bin\Apache\apache2.4.33\bin\php.ini' (length=50)'

phpにcertファイルをロードさせるには、このパスのphp.iniを'C:\Development\bin\Apache\apache2.4.33\bin\php.ini'に編集し、ダウンロードした場所にopenssl.cafile="C:/Development/bin/php/php7.2.4/extras/ssl/cacert.pem"を追加して、 https://curl.haxx.se/docs/caextractからcertファイルを配置する必要がありました。 html

drupal 8、wamp、php7.2.4を使ってwindows 10上にいます

0
Nicholas